From 9315268dac0c15d61f907b84a63e6f905f66d628 Mon Sep 17 00:00:00 2001 From: konstantin Date: Tue, 16 Jan 2024 16:18:52 +0000 Subject: [PATCH] Add JsonConverters for both COM _and_ ENUM `Verwendungszweck` wer soll das verstehen? --- ...ientSystemTextVerwendungszweckConverter.cs | 66 +++++++++++++++++++ .../LenientVerwendungszweckConverter.cs | 59 +++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 BO4E/meta/LenientConverters/LenientSystemTextVerwendungszweckConverter.cs create mode 100644 BO4E/meta/LenientConverters/LenientVerwendungszweckConverter.cs diff --git a/BO4E/meta/LenientConverters/LenientSystemTextVerwendungszweckConverter.cs b/BO4E/meta/LenientConverters/LenientSystemTextVerwendungszweckConverter.cs new file mode 100644 index 00000000..3fc5a8cf --- /dev/null +++ b/BO4E/meta/LenientConverters/LenientSystemTextVerwendungszweckConverter.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; +using BO4E.ENUM; +using Verwendungszweck = BO4E.COM.Verwendungszweck; // not the enum!! + + +namespace BO4E.meta.LenientConverters +{ + /// + /// A converter for Verwendungszweck (COM) + /// + public class VerwendungszweckJsonConverter : JsonConverter + { + private JsonSerializerOptions defaultOptions = LenientParsing.MOST_LENIENT.GetJsonSerializerOptions(); + + /// + public VerwendungszweckJsonConverter() + { + defaultOptions.Converters.Remove(defaultOptions.Converters.First(c => c.GetType() == typeof(JsonStringEnumConverter))); + defaultOptions.Converters.Add(new JsonStringEnumConverter()); + } + + /// + public override Verwendungszweck? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.StartArray) + { + var retList = new List(); + reader.Read(); + while (reader.TokenType != JsonTokenType.EndArray) + { + retList.Add(System.Text.Json.JsonSerializer.Deserialize(ref reader, defaultOptions)); + //read end object + reader.Read(); + } + + return new BO4E.COM.Verwendungszweck { Marktrolle = Marktrolle.LF, Zweck = retList }; + } + + if (reader.TokenType == JsonTokenType.String) + { + var retList = new List + { + Enum.Parse(reader.GetString().ToUpper()) + }; + return new BO4E.COM.Verwendungszweck { Marktrolle = Marktrolle.LF, Zweck = retList }; + } + + return reader.TokenType switch + { + JsonTokenType.Null => null, + JsonTokenType.StartObject => System.Text.Json.JsonSerializer.Deserialize(ref reader, defaultOptions), + _ => null + }; + } + + /// + public override void Write(Utf8JsonWriter writer, BO4E.COM.Verwendungszweck value, JsonSerializerOptions options) + { + System.Text.Json.JsonSerializer.Serialize(writer, value, defaultOptions); + } + } +} diff --git a/BO4E/meta/LenientConverters/LenientVerwendungszweckConverter.cs b/BO4E/meta/LenientConverters/LenientVerwendungszweckConverter.cs new file mode 100644 index 00000000..fcd5b991 --- /dev/null +++ b/BO4E/meta/LenientConverters/LenientVerwendungszweckConverter.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using BO4E.COM; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Marktrolle = BO4E.ENUM.Marktrolle; + +namespace BO4E.meta.LenientConverters +{ + /// + /// A converter for Verwendungszweck (ENUM) + /// + public class VerwendungszweckJsonNetConverter : JsonConverter + { + /// + public override bool CanConvert(Type objectType) + { + return objectType == typeof(Verwendungszweck); + } + + /// + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + if (reader.TokenType == JsonToken.Integer) + { + var retList = new List + { + Enum.Parse(Enum.GetName(typeof(ENUM.Verwendungszweck), reader.Value)) + }; + return new Verwendungszweck { Marktrolle = Marktrolle.LF, Zweck = retList }; + } + + if (reader.TokenType == JsonToken.String) + { + var retList = new List + { + Enum.Parse((string)reader.Value) + }; + return new Verwendungszweck { Marktrolle = Marktrolle.LF, Zweck = retList }; + } + + return JToken.ReadFrom(reader).ToObject(); + } + + /// + public override bool CanWrite => true; + + /// + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(value); + } + } +}