From 5f6670a5c0a52556d66a1fb51ad3c8b30d8804bd Mon Sep 17 00:00:00 2001 From: Maksim Golev Date: Thu, 13 Apr 2023 12:13:48 +0400 Subject: [PATCH] fix(76268): Fix invalid behavior for ignored properties with "new" modifier of derived class. --- .../gen/JsonSourceGenerator.Parser.cs | 2 +- .../Serialization/Metadata/JsonTypeInfo.cs | 3 ++- .../tests/Common/PropertyVisibilityTests.cs | 22 +++++++++++++++++++ .../Serialization/PropertyVisibilityTests.cs | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Text.Json/gen/JsonSourceGenerator.Parser.cs b/src/libraries/System.Text.Json/gen/JsonSourceGenerator.Parser.cs index f64624dddb884..73d5355d9351f 100644 --- a/src/libraries/System.Text.Json/gen/JsonSourceGenerator.Parser.cs +++ b/src/libraries/System.Text.Json/gen/JsonSourceGenerator.Parser.cs @@ -1011,7 +1011,7 @@ private static void CacheMember( if (propGenSpec.DefaultIgnoreCondition == JsonIgnoreCondition.Always) { ignoredMembers ??= new(); - ignoredMembers.Add(propGenSpec.MemberName, memberInfo); + ignoredMembers[propGenSpec.MemberName] = memberInfo; } } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfo.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfo.cs index b7ebe9b005473..aa6c84ece702e 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfo.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/JsonTypeInfo.cs @@ -1405,7 +1405,8 @@ public void AddPropertyWithConflictResolution(JsonPropertyInfo jsonPropertyInfo, if (jsonPropertyInfo.IsIgnored) { - (state.IgnoredProperties ??= new()).Add(memberName, jsonPropertyInfo); + state.IgnoredProperties ??= new(); + state.IgnoredProperties[memberName] = jsonPropertyInfo; } } } diff --git a/src/libraries/System.Text.Json/tests/Common/PropertyVisibilityTests.cs b/src/libraries/System.Text.Json/tests/Common/PropertyVisibilityTests.cs index e0e4e3ab2dd06..60bb9ab11a3f2 100644 --- a/src/libraries/System.Text.Json/tests/Common/PropertyVisibilityTests.cs +++ b/src/libraries/System.Text.Json/tests/Common/PropertyVisibilityTests.cs @@ -241,6 +241,22 @@ public async Task Ignore_BasePublicPropertyIgnored_ConflictWithDerivedPrivate() Assert.Equal("NewDefaultValue", ((ClassWithIgnoredPublicPropertyAndNewSlotPrivate)obj).MyString); } + [Fact] + public async void Ignore_BasePublicPropertyIgnored_ConflictWithDerivedPublicPropertyIgnored() + { + var obj = new ClassWithIgnoredPublicPropertyAndNewSlotPublicAndIgnoredToo(); + + string json = await Serializer.SerializeWrapper(obj); + + Assert.Equal(@"{}", json); + + json = @"{""MyString"":""NewValue""}"; + obj = await Serializer.DeserializeWrapper(json); + + Assert.Equal("DefaultValue", ((ClassWithIgnoredPublicProperty)obj).MyString); + Assert.Equal("NewDefaultValue", obj.MyString); + } + [Fact] public async Task Ignore_VerifyNoReferenceToGetterAndSetter() { @@ -812,6 +828,12 @@ public class ClassWithIgnoredPublicPropertyAndNewSlotPrivate : ClassWithIgnoredP internal new string MyString { get; set; } = "NewDefaultValue"; } + public class ClassWithIgnoredPublicPropertyAndNewSlotPublicAndIgnoredToo : ClassWithIgnoredPublicProperty + { + [JsonIgnore] + public new string MyString { get; set; } = "NewDefaultValue"; + } + public class ClassWithIgnoredPropertyNamingConflictPrivate { [JsonIgnore] diff --git a/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/Serialization/PropertyVisibilityTests.cs b/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/Serialization/PropertyVisibilityTests.cs index 3c15522874cfb..4cbed0897b184 100644 --- a/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/Serialization/PropertyVisibilityTests.cs +++ b/src/libraries/System.Text.Json/tests/System.Text.Json.SourceGeneration.Tests/Serialization/PropertyVisibilityTests.cs @@ -174,6 +174,7 @@ public override async Task HonorJsonPropertyName_PrivateSetter() [JsonSerializable(typeof(Class_PropertyWith_ProtectedInitOnlySetter))] [JsonSerializable(typeof(ClassWithIgnoredPublicProperty))] [JsonSerializable(typeof(ClassWithIgnoredPublicPropertyAndNewSlotPrivate))] + [JsonSerializable(typeof(ClassWithIgnoredPublicPropertyAndNewSlotPublicAndIgnoredToo))] [JsonSerializable(typeof(ClassWithIgnoredPropertyPolicyConflictPublic))] [JsonSerializable(typeof(ClassWithIgnoredPropertyNamingConflictPrivate))] [JsonSerializable(typeof(ClassWithIgnoredNewSlotProperty))] @@ -419,6 +420,7 @@ public void PublicContextAndJsonSerializerOptions() [JsonSerializable(typeof(Class_PropertyWith_ProtectedInitOnlySetter))] [JsonSerializable(typeof(ClassWithIgnoredPublicProperty))] [JsonSerializable(typeof(ClassWithIgnoredPublicPropertyAndNewSlotPrivate))] + [JsonSerializable(typeof(ClassWithIgnoredPublicPropertyAndNewSlotPublicAndIgnoredToo))] [JsonSerializable(typeof(ClassWithIgnoredPropertyPolicyConflictPublic))] [JsonSerializable(typeof(ClassWithIgnoredPropertyNamingConflictPrivate))] [JsonSerializable(typeof(ClassWithIgnoredNewSlotProperty))]