From 6c9e70990b5cc50722f8d71fb04ca479d1e5bd8b Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 26 Feb 2024 10:49:28 +0800 Subject: [PATCH] Pass `JsonSerializerOptions` when serializing the `enum`. --- .../AbpStringToEnumConverter.cs | 8 +++++++- .../Volo/Abp/Json/AbpStringToEnum_Tests.cs | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs index 9b20a4aa09..ac6208f47b 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/AbpStringToEnumConverter.cs @@ -11,6 +11,8 @@ public class AbpStringToEnumConverter : JsonConverter private JsonSerializerOptions? _readJsonSerializerOptions; + private JsonSerializerOptions? _writeJsonSerializerOptions; + public AbpStringToEnumConverter() : this(namingPolicy: null, allowIntegerValues: true) { @@ -39,7 +41,11 @@ public class AbpStringToEnumConverter : JsonConverter public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) { - JsonSerializer.Serialize(writer, value); + _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, x => + x == this || + x.GetType() == typeof(AbpStringToEnumFactory)); + + JsonSerializer.Serialize(writer, value, _writeJsonSerializerOptions); } public override T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs index 8d00afd109..3996ddafe5 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/AbpStringToEnum_Tests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text.Json; +using System.Text.Json.Serialization; using Shouldly; using Volo.Abp.Json.SystemTextJson.JsonConverters; using Xunit; @@ -53,10 +54,26 @@ public class AbpStringToEnum_Tests var testClassJson = JsonSerializer.Serialize(new TestClass() { Day = DayOfWeek.Monday - }); + }, options); testClassJson.ShouldBe("{\"Day\":1}"); + options = new JsonSerializerOptions() + { + Converters = + { + new AbpStringToEnumFactory(), + new JsonStringEnumConverter() + } + }; + + testClassJson = JsonSerializer.Serialize(new TestClass() + { + Day = DayOfWeek.Monday + }, options); + + testClassJson.ShouldBe("{\"Day\":\"Monday\"}"); + testClassJson = JsonSerializer.Serialize(new Dictionary { {DayOfWeek.Monday, "Mo"}