diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs index a29c29e4..fb3b50e4 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ArrayToObjectFactoryConverter.cs @@ -7,7 +7,7 @@ public class ArrayToObjectFactoryConverter : JsonConverterFactory { public override bool CanConvert(Type typeToConvert) { - return true; + return typeToConvert.IsClass; } public override JsonConverter? CreateConverter( @@ -15,10 +15,9 @@ public class ArrayToObjectFactoryConverter : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance( + return Activator.CreateInstance( typeof(ArrayToObjectConverter<>).MakeGenericType(typeToConvert) - ); + ) as JsonConverter; } private class ArrayToObjectConverter : JsonConverter diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs index 1855c0f6..d535c09d 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/BaseInteractionRequestDataConverter.cs @@ -37,6 +37,12 @@ public class BaseInteractionRequestDataConverter : JsonConverter).MakeGenericType( typeToConvert.GenericTypeArguments[0], typeToConvert.GenericTypeArguments[1].GenericTypeArguments[0] ) - ); + ) as JsonConverter; } } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/DictionaryOrListConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/DictionaryOrListConverter.cs index 8f2269bf..e479f597 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/DictionaryOrListConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/DictionaryOrListConverter.cs @@ -16,13 +16,12 @@ public class DictionaryOrListConverter : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance( + return Activator.CreateInstance( typeof(DictionaryOrListConverter<,>).MakeGenericType( typeToConvert.GenericTypeArguments[0], typeToConvert.GenericTypeArguments[1] ) - ); + ) as JsonConverter; } } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs index 68bd6330..d73bb7e9 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs @@ -16,18 +16,13 @@ public class EftEnumConverterFactory : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance(typeof(EftEnumConverter<>).MakeGenericType(typeToConvert)); + return Activator.CreateInstance(typeof(EftEnumConverter<>).MakeGenericType(typeToConvert)) + as JsonConverter; } } public class EftEnumConverter : JsonConverter { - private static readonly JsonSerializerOptions _options = new() - { - Converters = { new JsonStringEnumConverter() }, - }; - public override T? Read( ref Utf8JsonReader reader, Type typeToConvert, @@ -56,17 +51,17 @@ public class EftEnumConverter : JsonConverter { if (typeof(T).GetFields().Any(f => f.FieldType == typeof(string))) { - JsonSerializer.Serialize(writer, value as string, _options); + JsonSerializer.Serialize(writer, value as string, options); } else { if (typeof(T).GetFields().Any(f => f.FieldType == typeof(int))) { - JsonSerializer.Serialize(writer, Convert.ToInt32(value), _options); + JsonSerializer.Serialize(writer, Convert.ToInt32(value), options); } else if (typeof(T).GetFields().Any(f => f.FieldType == typeof(byte))) { - JsonSerializer.Serialize(writer, Convert.ToByte(value), _options); + JsonSerializer.Serialize(writer, Convert.ToByte(value), options); } else { diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs index f4651243..4afd7829 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs @@ -17,26 +17,27 @@ public class EftListEnumConverterFactory : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance( + return Activator.CreateInstance( typeof(EftListEnumConverter<>).MakeGenericType( typeToConvert.GenericTypeArguments[0] ) - ); + ) as JsonConverter; } } public class EftListEnumConverter : JsonConverter> { + // We have to use these options here, because down below if we use the options passed we create a stack overflow + // Due to the converter trying to use itself private static readonly JsonSerializerOptions _options = new() { - Converters = { new JsonStringEnumConverter() }, + Converters = { new JsonStringEnumConverter(), new EftEnumConverterFactory() }, }; public override List? Read( ref Utf8JsonReader reader, Type typeToConvert, - JsonSerializerOptions options + JsonSerializerOptions _ ) { if (reader.TokenType == JsonTokenType.StartArray) @@ -47,7 +48,7 @@ public class EftListEnumConverter : JsonConverter> throw new JsonException(); } - public override void Write(Utf8JsonWriter writer, List value, JsonSerializerOptions options) + public override void Write(Utf8JsonWriter writer, List value, JsonSerializerOptions _) { writer.WriteStartArray(); foreach (var x1 in value) diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs index aad12719..d8fe04dc 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs @@ -16,10 +16,9 @@ public class EnumerableConverterFactory : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance( + return Activator.CreateInstance( typeof(EnumerableConverter<>).MakeGenericType(typeToConvert.GenericTypeArguments[0]) - ); + ) as JsonConverter; } } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ListOrTConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ListOrTConverter.cs index 71b6f356..eb7474bd 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ListOrTConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ListOrTConverter.cs @@ -16,10 +16,9 @@ public class ListOrTConverterFactory : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance( + return Activator.CreateInstance( typeof(ListOrTConverter<>).MakeGenericType(typeToConvert.GenericTypeArguments[0]) - ); + ) as JsonConverter; } } diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs index 61dab416..2f781516 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToNumberFactoryConverter.cs @@ -10,7 +10,15 @@ public class StringToNumberFactoryConverter : JsonConverterFactory { public override bool CanConvert(Type typeToConvert) { - return true; + var type = Nullable.GetUnderlyingType(typeToConvert) ?? typeToConvert; + + return type == typeof(byte) + || type == typeof(short) + || type == typeof(int) + || type == typeof(long) + || type == typeof(float) + || type == typeof(double) + || type == typeof(decimal); } public override JsonConverter? CreateConverter( @@ -18,10 +26,9 @@ public class StringToNumberFactoryConverter : JsonConverterFactory JsonSerializerOptions options ) { - return (JsonConverter) - Activator.CreateInstance( + return Activator.CreateInstance( typeof(StringToNumberConverter<>).MakeGenericType(typeToConvert) - ); + ) as JsonConverter; } private class StringToNumberConverter : JsonConverter @@ -66,7 +73,7 @@ public class StringToNumberFactoryConverter : JsonConverterFactory _stringParseMethod.Invoke(null, [value, CultureInfo.InvariantCulture]); } } - catch (Exception ex) + catch (Exception) { Debug.WriteLine( $"Failed to parse '{value}' into {typeToConvert.Name}, returning null." diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToObjectFactoryConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToObjectFactoryConverter.cs deleted file mode 100644 index 108cc83d..00000000 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/StringToObjectFactoryConverter.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace SPTarkov.Server.Core.Utils.Json.Converters; - -public class StringToObjectFactoryConverter : JsonConverterFactory -{ - public override bool CanConvert(Type typeToConvert) - { - return true; - } - - public override JsonConverter? CreateConverter( - Type typeToConvert, - JsonSerializerOptions options - ) - { - return (JsonConverter) - Activator.CreateInstance( - typeof(StringToObjectConverter<>).MakeGenericType(typeToConvert) - ); - } - - public class StringToObjectConverter : JsonConverter - { - public override T? Read( - ref Utf8JsonReader reader, - Type typeToConvert, - JsonSerializerOptions options - ) - { - switch (reader.TokenType) - { - case JsonTokenType.String: - // start array - reader.Read(); - return default; - case JsonTokenType.StartObject: - using (var jsonDocument = JsonDocument.ParseValue(ref reader)) - { - var jsonText = jsonDocument.RootElement.GetRawText(); - return JsonSerializer.Deserialize(jsonText, options); - } - } - - return default; - } - - public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) - { - if (EqualityComparer.Default.Equals(value, default)) - { - value = default; - } - - JsonSerializer.Serialize(writer, value, options); - } - } -} diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/IJsonConverterRegistrator.cs similarity index 73% rename from Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs rename to Libraries/SPTarkov.Server.Core/Utils/Json/IJsonConverterRegistrator.cs index bac3f1c6..853bf26e 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/IJsonConverterRegistrator.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/IJsonConverterRegistrator.cs @@ -1,6 +1,6 @@ using System.Text.Json.Serialization; -namespace SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Utils.Json; public interface IJsonConverterRegistrator { diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/SptJsonConverterRegistrator.cs similarity index 79% rename from Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs rename to Libraries/SPTarkov.Server.Core/Utils/Json/SptJsonConverterRegistrator.cs index 05612d6a..a779e996 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/SptJsonConverterRegistrator.cs @@ -1,9 +1,8 @@ -using System.Reflection; -using System.Text.Json.Serialization; -using Microsoft.Extensions.Logging; +using System.Text.Json.Serialization; using SPTarkov.DI.Annotations; +using SPTarkov.Server.Core.Utils.Json.Converters; -namespace SPTarkov.Server.Core.Utils.Json.Converters; +namespace SPTarkov.Server.Core.Utils.Json; [Injectable] public class SptJsonConverterRegistrator : IJsonConverterRegistrator diff --git a/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs b/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs index b216145b..8dc1fb3f 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/JsonUtil.cs @@ -2,7 +2,7 @@ using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; using SPTarkov.DI.Annotations; -using SPTarkov.Server.Core.Utils.Json.Converters; +using SPTarkov.Server.Core.Utils.Json; namespace SPTarkov.Server.Core.Utils;