【问题标题】:How to use default serialization in a custom JsonConverter如何在自定义 JsonConverter 中使用默认序列化
【发布时间】:2015-06-19 10:17:27
【问题描述】:

我有一个复杂的对象图,我正在使用 Json.NET 进行序列化/反序列化。一些对象派生自抽象类,因此为了使反序列化正常工作,我需要创建一个自定义JsonConverter。它的唯一作用是在反序列化时选择抽象类的适当具体实现,并允许 Json.NET 继续前进。

当我想序列化时,我的问题就来了。我根本不需要做任何定制的事情。我希望获得与使用 JsonConvert.SerializeObject 时完全相同的行为,而无需自定义 JsonConverter

但是,由于我使用自定义 JsonConverter 类来满足我的反序列化需求,因此我不得不提供 WriteJson 实现。由于 WriteJson 是抽象的,我不能只调用base.WriteJson,但我想基本上这样做。所以我的问题是,我在该方法中添加了什么来获得简单的默认行为?换句话说:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    // What goes here to get default processing?
}

【问题讨论】:

  • 你为什么不在你的序列化设置中打开TypeNameHandlingAuto 呢?如果实例类型与其声明的属性类型(将是接口或基类类型)不同,这将添加一个“$type”属性。这不正是你想要的吗?

标签: json json.net


【解决方案1】:

在您的自定义 JsonConverter 中,覆盖 CanWrite 并返回 false:

public override bool CanWrite { get { return false; } }

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    throw new NotImplementedException();
}

然后你可以从WriteJson 抛出一个异常,因为它不会被调用。

(同样,要在de序列化过程中获得默认行为,请覆盖CanRead 并返回false。)

请注意,相同的方法可用于JsonConverter<T>(在Json.NET 11.0.1 中引入),因为它只是JsonConverter 的子类,它引入了ReadJson()WriteJson() 的类型安全版本。

【讨论】:

  • 太明显了:)。谢谢!
  • 哦,CanWrite....很遗憾,即使在文档中也没有更清楚;)。完全忘记了查看基本类型。谢谢
猜你喜欢
  • 2021-04-02
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多