diff --git a/src/libraries/System.Text.Json/tests/Serialization/ExtensionDataTests.cs b/src/libraries/System.Text.Json/tests/Serialization/ExtensionDataTests.cs index 65c84a0a327e1..cf85ed0b5ce07 100644 --- a/src/libraries/System.Text.Json/tests/Serialization/ExtensionDataTests.cs +++ b/src/libraries/System.Text.Json/tests/Serialization/ExtensionDataTests.cs @@ -61,6 +61,42 @@ public static void ExtensionPropertyIgnoredWhenNull() Assert.Equal(expected, actual); } + [Fact] + public static void MultipleExtensionPropertyIgnoredWhenNull() + { + var obj = new ClassWithMultipleDictionaries(); + string actual = JsonSerializer.Serialize(obj); + Assert.Equal("{\"ActualDictionary\":null}", actual); + + obj = new ClassWithMultipleDictionaries + { + ActualDictionary = new Dictionary() + }; + actual = JsonSerializer.Serialize(obj); + Assert.Equal("{\"ActualDictionary\":{}}", actual); + + obj = new ClassWithMultipleDictionaries + { + MyOverflow = new Dictionary + { + { "test", "value" } + } + }; + actual = JsonSerializer.Serialize(obj); + Assert.Equal("{\"ActualDictionary\":null,\"test\":\"value\"}", actual); + + obj = new ClassWithMultipleDictionaries + { + ActualDictionary = new Dictionary(), + MyOverflow = new Dictionary + { + { "test", "value" } + } + }; + actual = JsonSerializer.Serialize(obj); + Assert.Equal("{\"ActualDictionary\":{},\"test\":\"value\"}", actual); + } + [Fact] public static void ExtensionPropertyAlreadyInstantiated() { @@ -510,6 +546,35 @@ public static void DeserializeIntoObjectProperty() Assert.Equal(JsonValueKind.Object, ((JsonElement)obj.MyOverflow["MyOverflow"]).ValueKind); } + [Fact] + public static void DeserializeIntoMultipleDictionaries() + { + ClassWithMultipleDictionaries obj; + string json; + + // Baseline dictionary. + json = @"{""ActualDictionary"":{""Key"": {""Property0"":-1}},""MyDict"":{""Property1"":1}}"; + obj = JsonSerializer.Deserialize(json); + Assert.Equal(1, obj.MyOverflow.Count); + Assert.Equal(1, ((JsonElement)obj.MyOverflow["MyDict"]).EnumerateObject().First().Value.GetInt32()); + Assert.Equal(1, obj.ActualDictionary.Count); + Assert.Equal(-1, ((JsonElement)obj.ActualDictionary["Key"]).EnumerateObject().First().Value.GetInt32()); + + // Attempt to deserialize null into the dictionary and overflow property. This is also treated as a missing property. + json = @"{""ActualDictionary"":null,""MyOverflow"":null}"; + obj = JsonSerializer.Deserialize(json); + Assert.Equal(1, obj.MyOverflow.Count); + Assert.Null(obj.MyOverflow["MyOverflow"]); + Assert.Null(obj.ActualDictionary); + + // Attempt to deserialize object into the dictionary and overflow property. This is also treated as a missing property. + json = @"{""ActualDictionary"":{},""MyOverflow"":{}}"; + obj = JsonSerializer.Deserialize(json); + Assert.Equal(1, obj.MyOverflow.Count); + Assert.Equal(JsonValueKind.Object, ((JsonElement)obj.MyOverflow["MyOverflow"]).ValueKind); + Assert.Equal(0, obj.ActualDictionary.Count); + } + [Fact] public static void DeserializeIntoJsonElementProperty() { @@ -614,5 +679,13 @@ private class ClassWithExtensionPropertyAsJsonElement [JsonExtensionData] public Dictionary MyOverflow { get; set; } } + + private class ClassWithMultipleDictionaries + { + [JsonExtensionData] + public Dictionary MyOverflow { get; set; } + + public Dictionary ActualDictionary { get; set; } + } } }