From 0527a8a76e8a69ba7ec8d08f473d91a05f607ba5 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 27 Jan 2025 11:52:07 +0100 Subject: [PATCH] Some small fixes in the System.Text.Json ArrayConverter, added support for flags in EnumConverter --- .../Converters/SystemTextJson/ArrayConverter.cs | 8 ++++++-- .../Converters/SystemTextJson/EnumConverter.cs | 7 +++++++ .../Testing/Comparers/SystemTextJsonComparer.cs | 8 ++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CryptoExchange.Net/Converters/SystemTextJson/ArrayConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/ArrayConverter.cs index 8d16480..a6e79a4 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/ArrayConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/ArrayConverter.cs @@ -89,6 +89,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson { if (prop.PropertyInfo.PropertyType == typeof(string)) writer.WriteStringValue(Convert.ToString(objValue, CultureInfo.InvariantCulture)); + else if(prop.PropertyInfo.PropertyType.IsEnum) + writer.WriteStringValue(EnumConverter.GetString(objValue)); + else if (prop.PropertyInfo.PropertyType == typeof(bool)) + writer.WriteBooleanValue((bool)objValue); else writer.WriteRawValue(Convert.ToString(objValue, CultureInfo.InvariantCulture)!); } @@ -187,12 +191,12 @@ namespace CryptoExchange.Net.Converters.SystemTextJson _converterOptionsCache.TryAdd(attribute.JsonConverterType, newOptions); } - value = JsonDocument.ParseValue(ref reader).Deserialize(targetType, newOptions); + value = JsonDocument.ParseValue(ref reader).Deserialize(attribute.PropertyInfo.PropertyType, newOptions); } else if (attribute.DefaultDeserialization) { // Use default deserialization - value = JsonDocument.ParseValue(ref reader).Deserialize(targetType, options); + value = JsonDocument.ParseValue(ref reader).Deserialize(attribute.PropertyInfo.PropertyType, SerializerOptions.WithConverters); } else { diff --git a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs index e4a3df4..46c3ee0 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs @@ -172,6 +172,13 @@ namespace CryptoExchange.Net.Converters.SystemTextJson return true; } + if (objectType.IsDefined(typeof(FlagsAttribute))) + { + var intValue = int.Parse(value); + result = Enum.ToObject(objectType, intValue); + return true; + } + try { // If no explicit mapping is found try to parse string diff --git a/CryptoExchange.Net/Testing/Comparers/SystemTextJsonComparer.cs b/CryptoExchange.Net/Testing/Comparers/SystemTextJsonComparer.cs index 4ee5b87..50eb76b 100644 --- a/CryptoExchange.Net/Testing/Comparers/SystemTextJsonComparer.cs +++ b/CryptoExchange.Net/Testing/Comparers/SystemTextJsonComparer.cs @@ -105,7 +105,7 @@ namespace CryptoExchange.Net.Testing.Comparers int i = 0; foreach (var item in jObj.Children()) { - var arrayProp = resultProps.Where(p => p.Item2 != null).SingleOrDefault(p => p.Item2!.Index == i).p; + var arrayProp = resultProps.Where(p => p.Item2 != null).FirstOrDefault(p => p.Item2!.Index == i).p; if (arrayProp != null) CheckPropertyValue(method, item, arrayProp.GetValue(resultObj), arrayProp.PropertyType, arrayProp.Name, "Array index " + i, ignoreProperties!); i++; @@ -264,9 +264,9 @@ namespace CryptoExchange.Net.Testing.Comparers int i = 0; foreach (var item in jtoken.Children()) { - var arrayProp = resultProps.Where(p => p.Item2 != null).SingleOrDefault(p => p.Item2!.Index == i).p; + var arrayProp = resultProps.Where(p => p.Item2 != null).FirstOrDefault(p => p.Item2!.Index == i).p; if (arrayProp != null) - CheckPropertyValue(method, item, arrayProp.GetValue(resultObj), propertyType, arrayProp.Name, "Array index " + i, ignoreProperties); + CheckPropertyValue(method, item, arrayProp.GetValue(resultObj), arrayProp.PropertyType, arrayProp.Name, "Array index " + i, ignoreProperties); i++; } @@ -350,7 +350,7 @@ namespace CryptoExchange.Net.Testing.Comparers int i = 0; foreach (var item in jObjs.Children()) { - var arrayProp = resultProps.Where(p => p.Item2 != null).SingleOrDefault(p => p.Item2!.Index == i).p; + var arrayProp = resultProps.Where(p => p.Item2 != null).FirstOrDefault(p => p.Item2!.Index == i).p; if (arrayProp != null) CheckPropertyValue(method, item, arrayProp.GetValue(propertyValue), arrayProp.PropertyType, arrayProp.Name, "Array index " + i, ignoreProperties!); i++;