From 0037bc441db554066b3ca4ec9ff03bfbb9081477 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Wed, 26 Apr 2023 15:35:45 +0100 Subject: [PATCH 1/2] fix JsonNode deserialising from null --- .../Serialization/Converters/Node/JsonArrayConverter.cs | 2 ++ .../Json/Serialization/Converters/Node/JsonNodeConverter.cs | 2 ++ .../Serialization/Converters/Node/JsonObjectConverter.cs | 2 ++ .../tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs | 6 ++++++ 4 files changed, 12 insertions(+) diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonArrayConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonArrayConverter.cs index 17b955cfe4fb25..bd44ed16726226 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonArrayConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonArrayConverter.cs @@ -20,6 +20,8 @@ public override void Write(Utf8JsonWriter writer, JsonArray value, JsonSerialize { case JsonTokenType.StartArray: return ReadList(ref reader, options.GetNodeOptions()); + case JsonTokenType.Null: + return null; default: Debug.Assert(false); throw ThrowHelper.GetInvalidOperationException_ExpectedArray(reader.TokenType); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonNodeConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonNodeConverter.cs index 5dd032cc743e03..4076784e1d8c28 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonNodeConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonNodeConverter.cs @@ -61,6 +61,8 @@ public override void Write(Utf8JsonWriter writer, JsonNode? value, JsonSerialize return ObjectConverter.Read(ref reader, typeToConvert, options); case JsonTokenType.StartArray: return ArrayConverter.Read(ref reader, typeToConvert, options); + case JsonTokenType.Null: + return null; default: Debug.Assert(false); throw new JsonException(); diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonObjectConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonObjectConverter.cs index fa4dce96fddd5f..860009ce74b5ee 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonObjectConverter.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Node/JsonObjectConverter.cs @@ -45,6 +45,8 @@ public override void Write(Utf8JsonWriter writer, JsonObject value, JsonSerializ { case JsonTokenType.StartObject: return ReadObject(ref reader, options.GetNodeOptions()); + case JsonTokenType.Null: + return null; default: Debug.Assert(false); throw ThrowHelper.GetInvalidOperationException_ExpectedObject(reader.TokenType); diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs index cabcf4091f7675..4092991c339f13 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections; +using System.Collections.Generic; using Xunit; namespace System.Text.Json.Nodes.Tests @@ -39,6 +41,10 @@ public static void JsonTypes_Deserialize() Assert.IsAssignableFrom(JsonNode.Parse("\"str\"")); Assert.IsAssignableFrom(JsonNode.Parse(ToUtf8("\"str\""))); Assert.IsType(JsonSerializer.Deserialize("\"str\"")); + + Assert.Null(JsonSerializer.Deserialize("null")); + Assert.Collection(JsonSerializer.Deserialize("[null]"), Assert.Null); + Assert.Collection(JsonSerializer.Deserialize>("{ \"Value\": null }"), kv => Assert.Null(kv.Value)); } [Fact] From b3be8c078add756c08b67b192f906ac42a38e273 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Fri, 28 Apr 2023 09:09:31 +0100 Subject: [PATCH 2/2] add further tests for more null-deserialising scenarios --- .../JsonNode/JsonNodeTests.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs index 4092991c339f13..a90d59a49ccd10 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.Tests/JsonNode/JsonNodeTests.cs @@ -42,11 +42,20 @@ public static void JsonTypes_Deserialize() Assert.IsAssignableFrom(JsonNode.Parse(ToUtf8("\"str\""))); Assert.IsType(JsonSerializer.Deserialize("\"str\"")); - Assert.Null(JsonSerializer.Deserialize("null")); - Assert.Collection(JsonSerializer.Deserialize("[null]"), Assert.Null); - Assert.Collection(JsonSerializer.Deserialize>("{ \"Value\": null }"), kv => Assert.Null(kv.Value)); + JsonType_Deserializes_Null(); + JsonType_Deserializes_Null(); + JsonType_Deserializes_Null(); } + private static void JsonType_Deserializes_Null() where TNode : JsonNode + { + Assert.Null(JsonSerializer.Deserialize("null")); + Assert.Collection(JsonSerializer.Deserialize("[null]"), Assert.Null); + Assert.Collection(JsonSerializer.Deserialize>("{ \"Value\": null }"), kv => Assert.Null(kv.Value)); + Assert.Null(JsonSerializer.Deserialize>("{ \"Value\": null }").Value); + } + private record ObjectWithNodeProperty(TNode Value) where TNode : JsonNode; + [Fact] public static void AsMethods_Throws() {