System.Text.Json 如何让转换器利用默认的 Write() 行为

System.Text.Json how to get converter to utilise default Write() behaviour

我已经为自定义转换器的 Read() 端编写了一个 system.text.json 自定义转换器。但是,对于 Write() 方面,我只想使用默认的 Write 功能来序列化对象,而不必手动滚动对象的序列化。我开始于...

public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
    throw new NotImplementedException();
}

我曾希望我可以简单地在 Write() 方法中使用标准 JsonSerializer.Serialize(Customer)。像...

public override void Write(Utf8JsonWriter writer, Customer value, JsonSerializerOptions options)
{
    return JsonSerializer.Serialize(value);
}

然而,这似乎正在回归 null。我想我所做的只是嵌套相同的行为。

作为绝望的表现,我也尝试删除 Write() 方法,希望标准功能能够填补这个空白,但我收到以下构建错误消息...

CS0534  'CustomerJsonConverter' does not implement inherited abstract member
'JsonConverter<Customer>.Write(Utf8JsonWriter, Customer, JsonSerializerOptions)'

Newtonsoft.Json 具有名为 CanReadCanWrite 的属性,可以设置为 False。这些分别强制转换器在反序列化和序列化时使用默认转换器功能。

我希望 System.Text.Json?

中有类似的内容

更新 1

使用 @Guilherme 的建议……部分有效。但是,该方法给出了一个不完整的 Json 对象。

作为背景,当我反序列化我的原始来源 Json 时,我不得不处理原始 Json(我无法控制)有一个字段可以可以是一个空的 "",或者一个对象 { "key": "value" } 或者一个数组 [{ "key": "value" },{ "key": "value" }]。在 Read()(反序列化器)中,我处理了这个并输出了一个一致的数组。

但是现在,当我序列化生成的对象时,Addresses 数组始终为空(空白)。这是我将 Write() 方法留空时的输出。请注意,“地址”没有值或逗号分隔符。

{
    "Customer": {
        "firstName": "John",
        :
        other values
        :
        "Addresses": "Phone": "01234567890"
    }
}

我是否必须滚动自己的 Json文档并在 Write 方法中使用它?

我已经找到答案了。 :-)

当我请求一个 Customer 的实例被序列化时...

string json = JsonSerializer.Serialize(customer);

... 当序列化程序在 Customer 中命中 Addresses sub-class 时,它调用我的自定义转换器的 Write() 方法,将当前 Json writer 实例、要序列化的 Addresses 对象实例以及任何转换器选项。

很简单,因为我已经在我的客户转换器的 Read() 方法中正确地反序列化了原始的古怪 Json 并创建了一个适当的 List<>,所以 Write() 可以简单地序列化使用地址 class 的 Addresses 实例。代码看起来像这样...

public override void Write(Utf8JsonWriter writer, Addresses value, JsonSerializerOptions options)
{
    JsonSerializer.Serialize(writer, value);
}