using System.Diagnostics;
using System.Text.Json.Serialization;
public static void Main()
string serialized = JsonSerializer.Serialize(new ClassWithNullableStruct_ConverterOnProperty { MyStruct = new TestStruct { InnerValue = 5 } });
Console.WriteLine(@"{""MyStruct"":{""InnerValue"":10}}" == serialized);
ClassWithNullableStruct_ConverterOnProperty obj = JsonSerializer.Deserialize<ClassWithNullableStruct_ConverterOnProperty>(serialized);
Console.WriteLine(15 == obj.MyStruct?.InnerValue);
private class ClassWithNullableStruct_ConverterOnProperty
[JsonConverter(typeof(JsonTestStructValueChangingConverter))]
public TestStruct? MyStruct { get; set; }
private class JsonTestStructValueChangingConverter : JsonConverter<TestStruct>
public override bool CanConvert(Type typeToConvert) =>
typeToConvert == typeof(TestStruct) || typeToConvert == typeof(TestStruct?);
public override TestStruct Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
Debug.Assert(reader.TokenType == JsonTokenType.StartObject);
Debug.Assert(reader.TokenType == JsonTokenType.PropertyName);
Debug.Assert(reader.GetString() == "InnerValue");
InnerValue = reader.GetInt32() + 5
Debug.Assert(reader.TokenType == JsonTokenType.EndObject);
public override void Write(Utf8JsonWriter writer, TestStruct value, JsonSerializerOptions options)
writer.WriteStartObject();
writer.WriteNumber("InnerValue", value.InnerValue + 5);
private struct TestStruct
public int InnerValue { get; set; }