【问题标题】:System.Text.Json how to get converter to utilise default Write() behaviourSystem.Text.Json 如何让转换器利用默认的 Write() 行为
【发布时间】:2021-03-22 03:46:01
【问题描述】:

我为自定义转换器的Read() 端编写了一个system.text.json 自定义转换器。但是,对于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"
    }
}

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

【问题讨论】:

标签: c# json converters system.text.json


【解决方案1】:

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

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

string json = JsonSerializer.Serialize(customer);

...当序列化程序遇到Customer 中的Addresses 子类时,它会调用我的自定义转换器的Write() 方法,将当前的Json writer 实例、要序列化的Addresses 对象实例传递给它,以及任何转换器选项。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2021-11-08
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多