@@ -26,14 +26,14 @@ public override IMemberInterface Read(ref Utf8JsonReader reader, Type typeToConv
2626
2727 string value = reader . GetString ( ) ;
2828
29- return new StructMember ( value ) ;
29+ return value == null ? null : new StructMember ( value ) ;
3030 }
3131
3232 public override void Write ( Utf8JsonWriter writer , IMemberInterface value , JsonSerializerOptions options )
3333 {
3434 WriteCallCount ++ ;
3535
36- JsonSerializer . Serialize ( writer , value . Value , typeof ( string ) , options ) ;
36+ JsonSerializer . Serialize < string > ( writer , value == null ? null : value . Value , options ) ;
3737 }
3838 }
3939
@@ -46,6 +46,7 @@ private class StructToObjectConverter : JsonConverter<object>
4646
4747 public override bool CanConvert ( Type typeToConvert )
4848 {
49+ typeToConvert = Nullable . GetUnderlyingType ( typeToConvert ) ?? typeToConvert ;
4950 return typeof ( IMemberInterface ) . IsAssignableFrom ( typeToConvert ) ;
5051 }
5152
@@ -55,14 +56,14 @@ public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS
5556
5657 string value = reader . GetString ( ) ;
5758
58- return new StructMember ( value ) ;
59+ return value == null ? null : new StructMember ( value ) ;
5960 }
6061
6162 public override void Write ( Utf8JsonWriter writer , object value , JsonSerializerOptions options )
6263 {
6364 WriteCallCount ++ ;
6465
65- JsonSerializer . Serialize ( writer , ( ( IMemberInterface ) value ) . Value , typeof ( string ) , options ) ;
66+ JsonSerializer . Serialize < string > ( writer , value == null ? null : ( ( IMemberInterface ) value ) . Value , options ) ;
6667 }
6768 }
6869
@@ -131,7 +132,6 @@ public static void StructMemberToObjectConverter()
131132 }
132133
133134 [ Fact ]
134- [ ActiveIssue ( "https://github.com/dotnet/runtime/issues/36329" ) ]
135135 public static void NullableStructMemberToInterfaceConverter ( )
136136 {
137137 const string expected = @"{""MyStructProperty"":""StructProperty"",""MyClassProperty"":""ClassProperty"",""MyStructField"":""StructField"",""MyClassField"":""ClassField""}" ;
@@ -164,7 +164,6 @@ public static void NullableStructMemberToInterfaceConverter()
164164 }
165165
166166 [ Fact ]
167- [ ActiveIssue ( "https://github.com/dotnet/runtime/issues/36329" ) ]
168167 public static void NullableStructMemberToObjectConverter ( )
169168 {
170169 const string expected = @"{""MyStructProperty"":""StructProperty"",""MyClassProperty"":""ClassProperty"",""MyStructField"":""StructField"",""MyClassField"":""ClassField""}" ;
@@ -196,5 +195,71 @@ public static void NullableStructMemberToObjectConverter()
196195 }
197196 }
198197
198+ [ Fact ]
199+ public static void NullableStructMemberWithNullsToInterfaceConverter ( )
200+ {
201+ const string expected = @"{""MyStructProperty"":null,""MyClassProperty"":null,""MyStructField"":null,""MyClassField"":null}" ;
202+
203+ var converter = new StructToInterfaceConverter ( ) ;
204+ var options = new JsonSerializerOptions ( )
205+ {
206+ IncludeFields = true ,
207+ } ;
208+ options . Converters . Add ( converter ) ;
209+
210+ string json ;
211+
212+ {
213+ var obj = new TestClassWithNullableStructMember ( ) ;
214+ json = JsonSerializer . Serialize ( obj , options ) ;
215+
216+ Assert . Equal ( 4 , converter . WriteCallCount ) ;
217+ Assert . Equal ( expected , json ) ;
218+ }
219+
220+ {
221+ var obj = JsonSerializer . Deserialize < TestClassWithNullableStructMember > ( json , options ) ;
222+
223+ Assert . Equal ( 4 , converter . ReadCallCount ) ;
224+ Assert . Null ( obj . MyStructProperty ) ;
225+ Assert . Null ( obj . MyStructField ) ;
226+ Assert . Null ( obj . MyClassProperty ) ;
227+ Assert . Null ( obj . MyClassField ) ;
228+ }
229+ }
230+
231+ [ Fact ]
232+ public static void NullableStructMemberWithNullsToObjectConverter ( )
233+ {
234+ const string expected = @"{""MyStructProperty"":null,""MyClassProperty"":null,""MyStructField"":null,""MyClassField"":null}" ;
235+
236+ var converter = new StructToObjectConverter ( ) ;
237+ var options = new JsonSerializerOptions ( )
238+ {
239+ IncludeFields = true ,
240+ } ;
241+ options . Converters . Add ( converter ) ;
242+
243+ string json ;
244+
245+ {
246+ var obj = new TestClassWithNullableStructMember ( ) ;
247+ json = JsonSerializer . Serialize ( obj , options ) ;
248+
249+ Assert . Equal ( 4 , converter . WriteCallCount ) ;
250+ Assert . Equal ( expected , json ) ;
251+ }
252+
253+ {
254+ var obj = JsonSerializer . Deserialize < TestClassWithNullableStructMember > ( json , options ) ;
255+
256+ Assert . Equal ( 4 , converter . ReadCallCount ) ;
257+ Assert . Null ( obj . MyStructProperty ) ;
258+ Assert . Null ( obj . MyStructField ) ;
259+ Assert . Null ( obj . MyClassProperty ) ;
260+ Assert . Null ( obj . MyClassField ) ;
261+ }
262+ }
263+
199264 }
200265}
0 commit comments