@@ -2653,5 +2653,94 @@ public async Task JsonIgnoreCondition_WhenWritingDefault_OnInterface()
26532653 json = await JsonSerializerWrapperForString . SerializeWrapper ( obj ) ;
26542654 Assert . Equal ( "{\" MyProp\" :{}}" , json ) ;
26552655 }
2656+
2657+ public class ConcreteDerivedClass : AbstractBaseClass
2658+ {
2659+ // Ignored including on base class:
2660+ [ JsonIgnore ] public override int Abstract_Ignored_Property { get ; set ; }
2661+ [ JsonIgnore ] public override int Virtual_Ignored_Property { get ; set ; }
2662+
2663+ // Ignored but not specified on base class:
2664+ [ JsonIgnore ] public override int Abstract_IgnoredOnConcrete_Property { get ; set ; }
2665+ [ JsonIgnore ] public override int Virtual_IgnoredOnConcrete_Property { get ; set ; }
2666+
2667+ // Ignored specified on base class:
2668+ [ JsonPropertyOrder ( 1 ) ] public override int Abstract_IgnoredOnBase_Property { get ; set ; }
2669+ [ JsonPropertyOrder ( 2 ) ] public override int Virtual_IgnoredOnBase_Property { get ; set ; }
2670+
2671+ // Standard overrides (not ignored):
2672+ [ JsonPropertyOrder ( 3 ) ] public override int Abstract_Property { get ; set ; }
2673+ [ JsonPropertyOrder ( 4 ) ] public override int Virtual_Property { get ; set ; }
2674+ }
2675+
2676+ public abstract class AbstractBaseClass
2677+ {
2678+ [ JsonIgnore ] public abstract int Abstract_Ignored_Property { get ; set ; }
2679+ [ JsonIgnore ] public virtual int Virtual_Ignored_Property { get ; set ; }
2680+
2681+ public abstract int Abstract_IgnoredOnConcrete_Property { get ; set ; }
2682+ public virtual int Virtual_IgnoredOnConcrete_Property { get ; set ; }
2683+
2684+ [ JsonIgnore ] public abstract int Abstract_IgnoredOnBase_Property { get ; set ; }
2685+ [ JsonIgnore ] public virtual int Virtual_IgnoredOnBase_Property { get ; set ; }
2686+
2687+ public abstract int Abstract_Property { get ; set ; }
2688+ public virtual int Virtual_Property { get ; set ; }
2689+ }
2690+
2691+ [ Fact ]
2692+ public async Task JsonIgnoreCondition_Polymorphic ( )
2693+ {
2694+ ConcreteDerivedClass obj = new ( )
2695+ {
2696+ Abstract_Ignored_Property = - 1 ,
2697+ Virtual_Ignored_Property = - 1 ,
2698+ Abstract_IgnoredOnConcrete_Property = - 1 ,
2699+ Virtual_IgnoredOnConcrete_Property = - 1 ,
2700+ Abstract_IgnoredOnBase_Property = 1 ,
2701+ Virtual_IgnoredOnBase_Property = 2 ,
2702+ Abstract_Property = 3 ,
2703+ Virtual_Property = 4 ,
2704+ } ;
2705+
2706+ // Verify properties work as expected.
2707+ Assert . Equal ( - 1 , obj . Abstract_Ignored_Property ) ;
2708+ Assert . Equal ( - 1 , obj . Virtual_Ignored_Property ) ;
2709+ Assert . Equal ( - 1 , obj . Abstract_IgnoredOnConcrete_Property ) ;
2710+ Assert . Equal ( - 1 , obj . Virtual_IgnoredOnConcrete_Property ) ;
2711+ Assert . Equal ( 1 , obj . Abstract_IgnoredOnBase_Property ) ;
2712+ Assert . Equal ( 2 , obj . Virtual_IgnoredOnBase_Property ) ;
2713+ Assert . Equal ( 3 , obj . Abstract_Property ) ;
2714+ Assert . Equal ( 4 , obj . Virtual_Property ) ;
2715+
2716+ const string ExpectedJson = "{" +
2717+ "\" Abstract_IgnoredOnBase_Property\" :1," +
2718+ "\" Virtual_IgnoredOnBase_Property\" :2," +
2719+ "\" Abstract_Property\" :3," +
2720+ "\" Virtual_Property\" :4}" ;
2721+
2722+ string json = await JsonSerializerWrapperForString . SerializeWrapper ( obj ) ;
2723+ Assert . Equal ( ExpectedJson , json ) ;
2724+
2725+ const string Json = "{" +
2726+ "\" Abstract_Ignored_Property\" :-1," +
2727+ "\" Virtual_Ignored_Property\" :-1," +
2728+ "\" Abstract_IgnoredOnConcrete_Property\" :-1," +
2729+ "\" Virtual_IgnoredOnConcrete_Property\" :-1," +
2730+ "\" Abstract_IgnoredOnBase_Property\" :1," +
2731+ "\" Virtual_IgnoredOnBase_Property\" :2," +
2732+ "\" Abstract_Property\" :3," +
2733+ "\" Virtual_Property\" :4}" ;
2734+
2735+ obj = await JsonSerializerWrapperForString . DeserializeWrapper < ConcreteDerivedClass > ( Json ) ;
2736+ Assert . Equal ( 0 , obj . Abstract_Ignored_Property ) ;
2737+ Assert . Equal ( 0 , obj . Virtual_Ignored_Property ) ;
2738+ Assert . Equal ( 0 , obj . Abstract_IgnoredOnConcrete_Property ) ;
2739+ Assert . Equal ( 0 , obj . Virtual_IgnoredOnConcrete_Property ) ;
2740+ Assert . Equal ( 1 , obj . Abstract_IgnoredOnBase_Property ) ;
2741+ Assert . Equal ( 2 , obj . Virtual_IgnoredOnBase_Property ) ;
2742+ Assert . Equal ( 3 , obj . Abstract_Property ) ;
2743+ Assert . Equal ( 4 , obj . Virtual_Property ) ;
2744+ }
26562745 }
26572746}
0 commit comments