From 1e888c241faa4affe2e378327cdf23a00fa20902 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 27 Oct 2020 20:35:33 +0800 Subject: [PATCH] Refactor. --- .../Abp/Json/AbpJsonSerializerOptionsSetup.cs | 1 - ...ureManagementApplicationContractsModule.cs | 6 ++-- .../JsonSerializerOptionsHelper.cs | 17 +++++++++ .../LocalizableStringInfoJsonConverter.cs | 24 ------------- .../SelectionStringValueItemJsonConverter.cs | 36 ------------------- ...ctionStringValueItemSourceJsonConverter.cs | 12 ++++--- .../StringValueTypeJsonConverter.cs | 22 ++++++------ .../ValueValidatorJsonConverter.cs | 19 +++++----- .../AbpFeatureManagementHttpApiModule.cs | 10 +++++- .../StringValueJsonConverter_Tests.cs | 2 +- 10 files changed, 60 insertions(+), 89 deletions(-) create mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/JsonSerializerOptionsHelper.cs delete mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/LocalizableStringInfoJsonConverter.cs delete mode 100644 modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemJsonConverter.cs diff --git a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonSerializerOptionsSetup.cs b/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonSerializerOptionsSetup.cs index c4b9981199..16e8119731 100644 --- a/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonSerializerOptionsSetup.cs +++ b/framework/src/Volo.Abp.Json/Volo/Abp/Json/AbpJsonSerializerOptionsSetup.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Json.JsonConverters; -using Volo.Abp.Json; namespace Volo.Abp.Json { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs index 3c9303f968..c3ca6c2adc 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/AbpFeatureManagementApplicationContractsModule.cs @@ -1,7 +1,7 @@ -using Volo.Abp.Application; +using System.Collections.Generic; +using Volo.Abp.Application; using Volo.Abp.FeatureManagement.JsonConverters; using Volo.Abp.Json; -using Volo.Abp.Json; using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; @@ -23,7 +23,7 @@ namespace Volo.Abp.FeatureManagement Configure(options => { - options.JsonSerializerOptions.Converters.Add(new StringValueTypeJsonConverter()); + options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter()); }); } } 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 new file mode 100644 index 0000000000..26927f59fe --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/JsonSerializerOptionsHelper.cs @@ -0,0 +1,17 @@ +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; + } + } +} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/LocalizableStringInfoJsonConverter.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/LocalizableStringInfoJsonConverter.cs deleted file mode 100644 index e9f5cf599c..0000000000 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/LocalizableStringInfoJsonConverter.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Text.Json; -using System.Text.Json.Serialization; -using Volo.Abp.Validation.StringValues; - -namespace Volo.Abp.FeatureManagement.JsonConverters -{ - public class LocalizableStringInfoJsonConverter : JsonConverter - { - public override LocalizableStringInfo Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - var rootElement = JsonDocument.ParseValue(ref reader).RootElement; - return new LocalizableStringInfo( - rootElement.GetProperty("ResourceName").GetString(), - rootElement.GetProperty("Name").GetString() - ); - } - - public override void Write(Utf8JsonWriter writer, LocalizableStringInfo value, JsonSerializerOptions options) - { - JsonSerializer.Serialize(writer, value); - } - } -} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemJsonConverter.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemJsonConverter.cs deleted file mode 100644 index 59b2f77c6b..0000000000 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemJsonConverter.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Text.Json; -using System.Text.Json.Serialization; -using Volo.Abp.Validation.StringValues; - -namespace Volo.Abp.FeatureManagement.JsonConverters -{ - public class SelectionStringValueItemJsonConverter : JsonConverter - { - public override ISelectionStringValueItem Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) - { - var rootElement = JsonDocument.ParseValue(ref reader).RootElement; - - var jsonSerializerOptions = new JsonSerializerOptions(); - jsonSerializerOptions.Converters.Add(new LocalizableStringInfoJsonConverter()); - - return new LocalizableSelectionStringValueItem - { - Value = rootElement.GetProperty("Value").GetString(), - DisplayText = JsonSerializer.Deserialize(rootElement.GetProperty("DisplayText").GetRawText(), jsonSerializerOptions) - }; - } - - public override void Write(Utf8JsonWriter writer, ISelectionStringValueItem value, JsonSerializerOptions options) - { - if (value.GetType() == typeof(LocalizableStringInfo)) - { - JsonSerializer.Serialize(writer, (LocalizableSelectionStringValueItem)value); - } - else - { - throw new JsonException("Unknown ISelectionStringValueItem type!"); - } - } - } -} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemSourceJsonConverter.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemSourceJsonConverter.cs index b523dba20b..0812fcc59f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemSourceJsonConverter.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/SelectionStringValueItemSourceJsonConverter.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Volo.Abp.Validation.StringValues; @@ -10,12 +11,13 @@ namespace Volo.Abp.FeatureManagement.JsonConverters { public override ISelectionStringValueItemSource Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { + var newOptions = JsonSerializerOptionsHelper.Create(options, this); + var rootElement = JsonDocument.ParseValue(ref reader).RootElement; - var jsonSerializerOptions = new JsonSerializerOptions(); - jsonSerializerOptions.Converters.Add(new SelectionStringValueItemJsonConverter()); + var items = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("Items", StringComparison.InvariantCultureIgnoreCase)).Value.GetRawText(); var selectionStringValueItem = - JsonSerializer.Deserialize>(rootElement.GetProperty("Items").GetRawText(), jsonSerializerOptions) ?? + JsonSerializer.Deserialize>(items, newOptions) ?? new List(); return new StaticSelectionStringValueItemSource(selectionStringValueItem.ToArray()); @@ -23,9 +25,11 @@ namespace Volo.Abp.FeatureManagement.JsonConverters public override void Write(Utf8JsonWriter writer, ISelectionStringValueItemSource value, JsonSerializerOptions options) { + var newOptions = JsonSerializerOptionsHelper.Create(options, this); + if (value.GetType() == typeof(StaticSelectionStringValueItemSource)) { - JsonSerializer.Serialize(writer, (StaticSelectionStringValueItemSource)value); + JsonSerializer.Serialize(writer, (StaticSelectionStringValueItemSource)value, newOptions); } else { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/StringValueTypeJsonConverter.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/StringValueTypeJsonConverter.cs index 5cdaf352bb..9ca037d001 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/StringValueTypeJsonConverter.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/StringValueTypeJsonConverter.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Volo.Abp.Validation.StringValues; @@ -10,33 +11,32 @@ namespace Volo.Abp.FeatureManagement.JsonConverters public override IStringValueType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var rootElement = JsonDocument.ParseValue(ref reader).RootElement; - var jsonSerializerOptions = new JsonSerializerOptions(); - jsonSerializerOptions.Converters.Add(new ValueValidatorJsonConverter()); - jsonSerializerOptions.Converters.Add(new SelectionStringValueItemSourceJsonConverter()); - - var name = rootElement.GetProperty("Name").GetString(); + var name = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("Name", StringComparison.InvariantCultureIgnoreCase)).Value.GetString(); + var newOptions = JsonSerializerOptionsHelper.Create(options, this, new ValueValidatorJsonConverter(), new SelectionStringValueItemSourceJsonConverter()); return name switch { - "SelectionStringValueType" => JsonSerializer.Deserialize(rootElement.GetRawText(), jsonSerializerOptions), - "FreeTextStringValueType" => JsonSerializer.Deserialize(rootElement.GetRawText(), jsonSerializerOptions), - "ToggleStringValueType" => JsonSerializer.Deserialize(rootElement.GetRawText(), jsonSerializerOptions), + "SelectionStringValueType" => JsonSerializer.Deserialize(rootElement.GetRawText(), newOptions), + "FreeTextStringValueType" => JsonSerializer.Deserialize(rootElement.GetRawText(), newOptions), + "ToggleStringValueType" => JsonSerializer.Deserialize(rootElement.GetRawText(), newOptions), _ => throw new ArgumentException($"{nameof(IStringValueType)} named {name} was not found!") }; } public override void Write(Utf8JsonWriter writer, IStringValueType value, JsonSerializerOptions options) { + var newOptions = JsonSerializerOptionsHelper.Create(options, this); + if (value.GetType() == typeof(FreeTextStringValueType)) { - JsonSerializer.Serialize(writer, (FreeTextStringValueType)value); + JsonSerializer.Serialize(writer, (FreeTextStringValueType)value, newOptions); } else if (value.GetType() == typeof(SelectionStringValueType)) { - JsonSerializer.Serialize(writer, (SelectionStringValueType)value); + JsonSerializer.Serialize(writer, (SelectionStringValueType)value, newOptions); } else if (value.GetType() == typeof(ToggleStringValueType)) { - JsonSerializer.Serialize(writer, (ToggleStringValueType)value); + JsonSerializer.Serialize(writer, (ToggleStringValueType)value, newOptions); } else { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorJsonConverter.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorJsonConverter.cs index b525651d73..bfea58b078 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorJsonConverter.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/JsonConverters/ValueValidatorJsonConverter.cs @@ -13,11 +13,12 @@ namespace Volo.Abp.FeatureManagement.JsonConverters public override IValueValidator Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var rootElement = JsonDocument.ParseValue(ref reader).RootElement; - var valueValidator = CreateValueValidatorByName(rootElement.GetProperty("Name").GetString()); + var name = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("Name", StringComparison.InvariantCultureIgnoreCase)).Value.GetString(); + var valueValidator = CreateValueValidatorByName(name); - var deserializeOptions = new JsonSerializerOptions(); - deserializeOptions.Converters.Add(new ObjectToInferredTypesConverter()); - var properties = JsonSerializer.Deserialize>(rootElement.GetProperty("Properties").GetRawText(), deserializeOptions); + var propertiesRawText = rootElement.EnumerateObject().FirstOrDefault(x => x.Name.Equals("Properties", StringComparison.InvariantCultureIgnoreCase)).Value.GetRawText(); + var newOptions = JsonSerializerOptionsHelper.Create(options, this, new ObjectToInferredTypesConverter()); + var properties = JsonSerializer.Deserialize>(propertiesRawText, newOptions); if (properties != null && properties.Any()) { foreach (var property in properties) @@ -31,21 +32,23 @@ namespace Volo.Abp.FeatureManagement.JsonConverters public override void Write(Utf8JsonWriter writer, IValueValidator value, JsonSerializerOptions options) { + var newOptions = JsonSerializerOptionsHelper.Create(options, this); + if (value.GetType() == typeof(AlwaysValidValueValidator)) { - JsonSerializer.Serialize(writer, (AlwaysValidValueValidator)value); + JsonSerializer.Serialize(writer, (AlwaysValidValueValidator)value, newOptions); } else if (value.GetType() == typeof(BooleanValueValidator)) { - JsonSerializer.Serialize(writer, (BooleanValueValidator)value); + JsonSerializer.Serialize(writer, (BooleanValueValidator)value, newOptions); } else if (value.GetType() == typeof(NumericValueValidator)) { - JsonSerializer.Serialize(writer, (NumericValueValidator)value); + JsonSerializer.Serialize(writer, (NumericValueValidator)value, newOptions); } else if (value.GetType() == typeof(StringValueValidator)) { - JsonSerializer.Serialize(writer, (StringValueValidator)value); + JsonSerializer.Serialize(writer, (StringValueValidator)value, newOptions); } else { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/AbpFeatureManagementHttpApiModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/AbpFeatureManagementHttpApiModule.cs index 5146061c3b..f062317d66 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/AbpFeatureManagementHttpApiModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/AbpFeatureManagementHttpApiModule.cs @@ -1,9 +1,12 @@ -using Localization.Resources.AbpUi; +using System.Collections.Generic; +using Localization.Resources.AbpUi; +using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.FeatureManagement.Localization; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.FeatureManagement.JsonConverters; namespace Volo.Abp.FeatureManagement { @@ -28,6 +31,11 @@ namespace Volo.Abp.FeatureManagement .Get() .AddBaseTypes(typeof(AbpUiResource)); }); + + Configure(options => + { + options.JsonSerializerOptions.Converters.AddIfNotContains(new StringValueTypeJsonConverter()); + }); } } } diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs index 4e5d4b20a3..c72cbddffd 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/StringValueJsonConverter_Tests.cs @@ -66,7 +66,7 @@ namespace Volo.Abp.FeatureManagement } }; - var serialized = _jsonSerializer.Serialize(featureListDto); + var serialized = _jsonSerializer.Serialize(featureListDto, indented: true); var featureListDto2 = _jsonSerializer.Deserialize(serialized);