diff --git a/framework/src/Volo.Abp.Core/System/Text/Json/JsonSerializerOptionsHelper.cs b/framework/src/Volo.Abp.Core/System/Text/Json/JsonSerializerOptionsHelper.cs new file mode 100644 index 0000000000..eea80f2fb5 --- /dev/null +++ b/framework/src/Volo.Abp.Core/System/Text/Json/JsonSerializerOptionsHelper.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace System.Text.Json +{ + public static class JsonSerializerOptionsHelper + { + public static JsonSerializerOptions Create(JsonSerializerOptions baseOptions, JsonConverter removeConverter, params JsonConverter[] addConverters) + { + return Create(baseOptions, x => x == removeConverter, addConverters); + } + + public static JsonSerializerOptions Create(JsonSerializerOptions baseOptions, Func removeConverterPredicate, params JsonConverter[] addConverters) + { + var options = new JsonSerializerOptions(baseOptions); + options.Converters.RemoveAll(removeConverterPredicate); + options.Converters.AddIfNotContains(addConverters); + return options; + } + } +} diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpExtraPropertyDictionaryJsonConverter.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpExtraPropertyDictionaryJsonConverter.cs index 5a4ef9d2df..f816cb6396 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpExtraPropertyDictionaryJsonConverter.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpExtraPropertyDictionaryJsonConverter.cs @@ -13,8 +13,9 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters { public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.RemoveAll(x => x == this || x.GetType() == typeof(AbpExtraPropertyDictionaryJsonConverterFactory)); + var newOptions = JsonSerializerOptionsHelper.Create(options, x => + x == this || + x.GetType() == typeof(AbpExtraPropertyDictionaryJsonConverterFactory)); var rootElement = JsonDocument.ParseValue(ref reader).RootElement; var extensibleObject = JsonSerializer.Deserialize(rootElement.GetRawText(), newOptions); @@ -31,8 +32,10 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.RemoveAll(x => x == this || x.GetType() == typeof(AbpExtraPropertyDictionaryJsonConverterFactory)); + var newOptions = JsonSerializerOptionsHelper.Create(options, x => + x == this || + x.GetType() == typeof(AbpExtraPropertyDictionaryJsonConverterFactory)); + JsonSerializer.Serialize(writer, value, newOptions); } } diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs index dcfe08f5c3..cfd5c17653 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToBooleanConverter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Buffers; using System.Buffers.Text; using System.Text.Json; @@ -29,8 +29,7 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.Remove(this); + var newOptions = JsonSerializerOptionsHelper.Create(options, this); var entityConverter = (JsonConverter)newOptions.GetConverter(typeof(bool)); entityConverter.Write(writer, value, newOptions); } diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs index cead695538..6aad6dd8df 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs @@ -28,16 +28,20 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.RemoveAll(x => x == this || x.GetType() == typeof(AbpStringToEnumFactory)); + var newOptions = JsonSerializerOptionsHelper.Create(options, x => + x == this || + x.GetType() == typeof(AbpStringToEnumFactory)); + newOptions.Converters.Add(_innerJsonStringEnumConverter.CreateConverter(typeToConvert, newOptions)); return JsonSerializer.Deserialize(ref reader, newOptions); } public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.RemoveAll(x => x == this || x.GetType() == typeof(AbpStringToEnumFactory)); + var newOptions = JsonSerializerOptionsHelper.Create(options, x => + x == this || + x.GetType() == typeof(AbpStringToEnumFactory)); + JsonSerializer.Serialize(writer, value, newOptions); } } diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs index c323293dd9..cdf2257a32 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs @@ -51,8 +51,7 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters public override void Write(Utf8JsonWriter writer, object objectToWrite, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.Remove(this); + var newOptions = JsonSerializerOptionsHelper.Create(options, this); JsonSerializer.Serialize(writer, objectToWrite, newOptions); } } diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/JsonConverters/EntityJsonConverter.cs b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/JsonConverters/EntityJsonConverter.cs index 576e7512fa..fbc222a46a 100644 --- a/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/JsonConverters/EntityJsonConverter.cs +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo/Abp/MemoryDb/JsonConverters/EntityJsonConverter.cs @@ -25,8 +25,7 @@ namespace Volo.Abp.MemoryDb.JsonConverters public override void Write(Utf8JsonWriter writer, TEntity value, JsonSerializerOptions options) { - var newOptions = new JsonSerializerOptions(options); - newOptions.Converters.Remove(this); + var newOptions = JsonSerializerOptionsHelper.Create(options, this); var entityConverter = (JsonConverter)newOptions.GetConverter(typeof(TEntity)); entityConverter.Write(writer, value, newOptions); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/JsonSerializerOptionsHelper.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/JsonSerializerOptionsHelper.cs deleted file mode 100644 index 26927f59fe..0000000000 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/JsonSerializerOptionsHelper.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Volo.Abp.FeatureManagement.JsonConverters -{ - internal static class JsonSerializerOptionsHelper - { - public static JsonSerializerOptions Create(JsonSerializerOptions baseOptions, JsonConverter removeConverter, params JsonConverter[] addConverters) - { - var options = new JsonSerializerOptions(baseOptions); - options.Converters.RemoveAll(x => x == removeConverter); - options.Converters.AddIfNotContains(addConverters); - return options; - } - } -}