diff --git a/Libraries/Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs b/Libraries/Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs index 6f89ba56..2a024d69 100644 --- a/Libraries/Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs +++ b/Libraries/Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs @@ -34,11 +34,7 @@ public class ArrayToObjectFactoryConverter : JsonConverterFactory reader.Read(); return default; case JsonTokenType.StartObject: - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText(); - return JsonSerializer.Deserialize(jsonText); - } + return JsonSerializer.Deserialize(ref reader, options); } return default; @@ -48,7 +44,8 @@ public class ArrayToObjectFactoryConverter : JsonConverterFactory { if (value == null) { - JsonSerializer.Serialize(writer, new List(), options); + writer.WriteStartArray(); + writer.WriteEndArray(); } else { diff --git a/Libraries/Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs b/Libraries/Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs index b57a3fc7..1ce3775a 100644 --- a/Libraries/Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs +++ b/Libraries/Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs @@ -20,10 +20,8 @@ public class BaseInteractionRequestDataConverter : JsonConverter(jsonText); - return ConvertToCorrectType(value, jsonText); + var value = JsonSerializer.Deserialize(ref reader, options); + return ConvertToCorrectType(value, reader.GetString()); } private BaseInteractionRequestData? ConvertToCorrectType(BaseInteractionRequestData? value, string jsonText) diff --git a/Libraries/Core/Utils/Json/Converters/EftListEnumConverter.cs b/Libraries/Core/Utils/Json/Converters/EftListEnumConverter.cs index a3fe75d2..fbc6ad77 100644 --- a/Libraries/Core/Utils/Json/Converters/EftListEnumConverter.cs +++ b/Libraries/Core/Utils/Json/Converters/EftListEnumConverter.cs @@ -17,22 +17,7 @@ public class EftListEnumConverter : JsonConverter> { if (reader.TokenType == JsonTokenType.StartArray) { - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText(); - jsonText = jsonText.Replace("[", "").Replace("]", ""); - var list = new List(); - if (!string.IsNullOrEmpty(jsonText)) - { - foreach (var str in jsonText.Split(",")) - { - var newStr = str.Replace("\r", "").Replace("\n", "").Trim(); - list.Add(JsonSerializer.Deserialize(newStr, options)); - } - } - - return list; - } + return JsonSerializer.Deserialize>(ref reader, _options); } throw new JsonException(); diff --git a/Libraries/Core/Utils/Json/Converters/ListOrTConverter.cs b/Libraries/Core/Utils/Json/Converters/ListOrTConverter.cs index 1c72d800..c5350384 100644 --- a/Libraries/Core/Utils/Json/Converters/ListOrTConverter.cs +++ b/Libraries/Core/Utils/Json/Converters/ListOrTConverter.cs @@ -24,26 +24,16 @@ public class ListOrTConverter : JsonConverter?> { case JsonTokenType.String: case JsonTokenType.Number: - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText(); - var value = JsonSerializer.Deserialize(jsonText, options); - return new ListOrT(null, value); - } + var singleValue = JsonSerializer.Deserialize(ref reader, options); + return new ListOrT(null, singleValue); + case JsonTokenType.StartArray: - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText(); - var list = JsonSerializer.Deserialize>(jsonText, options); - return new ListOrT(list, default); - } + var list = JsonSerializer.Deserialize>(ref reader, options); + return new ListOrT(list, default); + case JsonTokenType.StartObject: - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText(); - var obj = JsonSerializer.Deserialize(jsonText, options); - return new ListOrT(null, obj); - } + var obj = JsonSerializer.Deserialize(ref reader, options); + return new ListOrT(null, obj); default: throw new Exception($"Unable to translate object type {reader.TokenType} to ListOrT."); } diff --git a/Libraries/Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs b/Libraries/Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs index c232ca93..7bde0ab8 100644 --- a/Libraries/Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs +++ b/Libraries/Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Reflection; using System.Text.Json; using System.Text.Json.Serialization; @@ -18,47 +19,47 @@ public class StringToNumberFactoryConverter : JsonConverterFactory private class StringToNumberConverter : JsonConverter { + private static readonly MethodInfo? stringParseMethod; + + static StringToNumberConverter() + { + // Do reflection only once to get parse + var underlyingType = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T); + stringParseMethod = underlyingType.GetMethod("Parse", [typeof(string)]); + } + public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { + if (reader.TokenType == JsonTokenType.String) + { + var value = reader.GetString(); + + if (string.IsNullOrWhiteSpace(value) || value == "__REPLACEME__") + { + return default; + } + + try + { + var underlyingType = Nullable.GetUnderlyingType(typeToConvert) ?? typeToConvert; + + if (stringParseMethod != null) + { + return (T) stringParseMethod.Invoke(null, [value]); + } + } + catch (Exception ex) + { + Debug.WriteLine($"Failed to parse '{value}' into {typeToConvert.Name}, returning null."); + return default; + } + } + switch (reader.TokenType) { - case JsonTokenType.String: - var value = reader.GetString(); - if (string.IsNullOrWhiteSpace(value)) - { - return default; - } - - var type = typeToConvert; - try - { - if (typeToConvert.IsGenericType && - typeToConvert.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = typeToConvert.GenericTypeArguments[0]; - } - - return (T) type.GetMethods() - .First( - m => - m.Name == "Parse" && - m.GetParameters().Length == 1 && - m.GetParameters().First().ParameterType == typeof(string) - ) - .Invoke(null, [value]); - } - catch (Exception ex) - { - Debug.WriteLine($"Tried to convert {value} into {type.Name} but failed to parse it, null value will be used instead."); - } - - return default; case JsonTokenType.Number: - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText().Replace("\"", ""); - return JsonSerializer.Deserialize(jsonText); - } + return JsonSerializer.Deserialize(ref reader, options); + case JsonTokenType.Null: return default; default: