From a0260ffbb8095217c67c83ea77ec51c51f9ff5ad Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 9 Sep 2025 17:45:07 +0800 Subject: [PATCH 1/2] Optimize ObjectToInferredTypesConverter and add tests https://github.com/abpframework/abp/discussions/23692 --- .../ObjectToInferredTypesConverter.cs | 11 +++- .../ObjectToInferredTypesConverter_Tests.cs | 54 +++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ObjectToInferredTypesConverter_Tests.cs diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs index bf017d041e..4258bdcfc3 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs @@ -9,6 +9,8 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters; /// public class ObjectToInferredTypesConverter : JsonConverter { + private JsonSerializerOptions? _writeJsonSerializerOptions; + public override object Read( ref Utf8JsonReader reader, Type typeToConvert, @@ -26,6 +28,11 @@ public class ObjectToInferredTypesConverter : JsonConverter public override void Write( Utf8JsonWriter writer, object objectToWrite, - JsonSerializerOptions options) => - JsonSerializer.Serialize(writer, objectToWrite, objectToWrite.GetType(), options); + JsonSerializerOptions options) + { + _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, x => + x == this || + x.GetType() == typeof(ObjectToInferredTypesConverter)); + JsonSerializer.Serialize(writer, objectToWrite, objectToWrite.GetType(), _writeJsonSerializerOptions); + } } diff --git a/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ObjectToInferredTypesConverter_Tests.cs b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ObjectToInferredTypesConverter_Tests.cs new file mode 100644 index 0000000000..b5d5c3b394 --- /dev/null +++ b/framework/test/Volo.Abp.Json.Tests/Volo/Abp/Json/ObjectToInferredTypesConverter_Tests.cs @@ -0,0 +1,54 @@ +using System.Text.Json; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Json; + +public class ObjectToInferredTypesConverter_Tests : AbpJsonSystemTextJsonTestBase +{ + private readonly IJsonSerializer _jsonSerializer; + + public ObjectToInferredTypesConverter_Tests() + { + _jsonSerializer = GetRequiredService(); + } + + [Fact] + public void Test() + { + var objString = _jsonSerializer.Serialize(new object()); + objString.ShouldBe("{}"); + var obj = _jsonSerializer.Deserialize(objString); + obj.ShouldBeOfType(); + + var booleanString = _jsonSerializer.Serialize(true); + booleanString.ShouldBe("true"); + var boolean = _jsonSerializer.Deserialize(booleanString); + boolean.ShouldBe(true); + + var booleanString2 = _jsonSerializer.Serialize(false); + booleanString2.ShouldBe("false"); + var boolean2 = _jsonSerializer.Deserialize(booleanString2); + boolean2.ShouldBe(false); + + var numberString = _jsonSerializer.Serialize(1); + numberString.ShouldBe("1"); + var number = _jsonSerializer.Deserialize(numberString); + number.ShouldBe(1); + + var numberString2 = _jsonSerializer.Serialize(1.1); + numberString2.ShouldBe("1.1"); + var number2 = _jsonSerializer.Deserialize(numberString2); + number2.ShouldBe(1.1); + + var dateString = _jsonSerializer.Serialize(System.DateTime.Parse("2024-01-01")); + dateString.ShouldBe("\"2024-01-01T00:00:00\""); + var date = _jsonSerializer.Deserialize(dateString); + date.ShouldBe(System.DateTime.Parse("2024-01-01")); + + var textString = _jsonSerializer.Serialize("text"); + textString.ShouldBe("\"text\""); + var text = _jsonSerializer.Deserialize(textString); + text.ShouldBe("text"); + } +} From df5bdb71291f6ec74accbec9b416c7b88dc33d8a Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 9 Sep 2025 18:26:20 +0800 Subject: [PATCH 2/2] Refactor ObjectToInferredTypesConverter serialization logic --- .../ObjectToInferredTypesConverter.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs index 4258bdcfc3..85c47c738d 100644 --- a/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs +++ b/framework/src/Volo.Abp.Json.SystemTextJson/Volo/Abp/Json/SystemTextJson/JsonConverters/ObjectToInferredTypesConverter.cs @@ -9,8 +9,6 @@ namespace Volo.Abp.Json.SystemTextJson.JsonConverters; /// public class ObjectToInferredTypesConverter : JsonConverter { - private JsonSerializerOptions? _writeJsonSerializerOptions; - public override object Read( ref Utf8JsonReader reader, Type typeToConvert, @@ -30,9 +28,14 @@ public class ObjectToInferredTypesConverter : JsonConverter object objectToWrite, JsonSerializerOptions options) { - _writeJsonSerializerOptions ??= JsonSerializerOptionsHelper.Create(options, x => - x == this || - x.GetType() == typeof(ObjectToInferredTypesConverter)); - JsonSerializer.Serialize(writer, objectToWrite, objectToWrite.GetType(), _writeJsonSerializerOptions); + var runtimeType = objectToWrite.GetType(); + if (runtimeType == typeof(object)) + { + writer.WriteStartObject(); + writer.WriteEndObject(); + return; + } + + JsonSerializer.Serialize(writer, objectToWrite, runtimeType, options); } }