From bfd32100c6d48d28fb65af50708d3f7c8e6b2a90 Mon Sep 17 00:00:00 2001 From: Eirik Tsarpalis Date: Wed, 24 Nov 2021 16:15:15 +0000 Subject: [PATCH 1/3] Fix System.Object serialization with custom number handling --- .../Converters/Value/ObjectConverter.cs | 15 --------------- .../Serialization/Object.ReadTests.cs | 17 +++++++++++++++++ .../Serialization/Object.WriteTests.cs | 8 ++++++++ 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs index ddb2a899947b64..7ce4a2cb706b55 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs @@ -7,11 +7,6 @@ namespace System.Text.Json.Serialization.Converters { internal sealed class ObjectConverter : JsonConverter { - public ObjectConverter() - { - IsInternalConverterForNumberType = true; - } - public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (options.UnknownTypeHandling == JsonUnknownTypeHandling.JsonElement) @@ -50,15 +45,5 @@ internal override void WriteAsPropertyNameCore(Utf8JsonWriter writer, object? va runtimeConverter.WriteAsPropertyNameCoreAsObject(writer, value, options, isWritingExtensionDataProperty); } - - internal override object? ReadNumberWithCustomHandling(ref Utf8JsonReader reader, JsonNumberHandling handling, JsonSerializerOptions options) - { - if (options.UnknownTypeHandling == JsonUnknownTypeHandling.JsonElement) - { - return JsonElement.ParseValue(ref reader); - } - - return JsonNodeConverter.Instance.Read(ref reader, typeof(object), options); - } } } diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs index 6a36e96d3818b9..090e91f49f37d2 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Text.Json.Nodes; using Xunit; namespace System.Text.Json.Serialization.Tests @@ -655,5 +656,21 @@ public static void TooLittleJsonFails(string json) Assert.Equal(0, reader.BytesConsumed); } + + // Regression test for https://github.com/dotnet/runtime/issues/61995 + [Theory] + [InlineData(JsonUnknownTypeHandling.JsonElement, typeof(JsonElement))] + [InlineData(JsonUnknownTypeHandling.JsonNode, typeof(JsonNode))] + public static void ReadObjectWithNumberHandling(JsonUnknownTypeHandling unknownTypeHandling, Type expectedType) + { + var options = new JsonSerializerOptions + { + NumberHandling = JsonNumberHandling.AllowReadingFromString, + UnknownTypeHandling = unknownTypeHandling + }; + + object result = JsonSerializer.Deserialize(@"{ ""key"" : ""42"" }", options); + Assert.IsAssignableFrom(expectedType, result); + } } } diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs index d4e551d6d01b25..57a9bdf01d0121 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs @@ -138,5 +138,13 @@ public static void EscapingShouldntStackOverflow() Assert.Equal("{\"name\":\"\u6D4B\u8A6611\"}", result); } + + // Regressuib test fir https://github.com/dotnet/runtime/issues/61995 + [Fact] + public static void WriteObjectWithNumberHandling() + { + var options = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString }; + JsonSerializer.Serialize(new object(), options); + } } } From 549b20390f696d300e6d639165819e504b985f6b Mon Sep 17 00:00:00 2001 From: Eirik Tsarpalis Date: Wed, 24 Nov 2021 16:27:57 +0000 Subject: [PATCH 2/3] fix typos --- .../System.Text.Json.Tests/Serialization/Object.WriteTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs index 57a9bdf01d0121..d2000d649acc0b 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs @@ -139,7 +139,7 @@ public static void EscapingShouldntStackOverflow() Assert.Equal("{\"name\":\"\u6D4B\u8A6611\"}", result); } - // Regressuib test fir https://github.com/dotnet/runtime/issues/61995 + // Regression test for https://github.com/dotnet/runtime/issues/61995 [Fact] public static void WriteObjectWithNumberHandling() { From 39f942c904fa11ae7e643b3304443a1fc0ad8253 Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Fri, 7 Jan 2022 09:53:53 -0800 Subject: [PATCH 3/3] Address feedback --- .../Serialization/Object.ReadTests.cs | 3 +-- .../Serialization/Object.WriteTests.cs | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs index 090e91f49f37d2..c8a745398af275 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.ReadTests.cs @@ -657,11 +657,10 @@ public static void TooLittleJsonFails(string json) Assert.Equal(0, reader.BytesConsumed); } - // Regression test for https://github.com/dotnet/runtime/issues/61995 [Theory] [InlineData(JsonUnknownTypeHandling.JsonElement, typeof(JsonElement))] [InlineData(JsonUnknownTypeHandling.JsonNode, typeof(JsonNode))] - public static void ReadObjectWithNumberHandling(JsonUnknownTypeHandling unknownTypeHandling, Type expectedType) + public static void ReadSystemObjectWithNumberHandling(JsonUnknownTypeHandling unknownTypeHandling, Type expectedType) { var options = new JsonSerializerOptions { diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs index d2000d649acc0b..c569770e3027e1 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/Serialization/Object.WriteTests.cs @@ -139,12 +139,12 @@ public static void EscapingShouldntStackOverflow() Assert.Equal("{\"name\":\"\u6D4B\u8A6611\"}", result); } - // Regression test for https://github.com/dotnet/runtime/issues/61995 [Fact] - public static void WriteObjectWithNumberHandling() + public static void WriteSystemObjectWithNumberHandling() { var options = new JsonSerializerOptions { NumberHandling = JsonNumberHandling.AllowReadingFromString }; - JsonSerializer.Serialize(new object(), options); + string result = JsonSerializer.Serialize(new object(), options); + Assert.Equal("{}", result); } } }