为数据结构中的一个 class 指定一个自定义反序列化器,其余的留给默认反序列化器

Specify a custom deserializer for one class inside a data structure and leave the rest to the default deserializer

我有一个嵌套数据结构:Class A 包含 Class B 包含 Class C 包含 Class D.

使用 JSON.NET,是否有办法 "register" 仅针对 Class D 的自定义反序列化器——允许默认反序列化器处理 Classes A 到 C -- 然后通过单个方法调用反序列化整个数据结构以反序列化 Class A?

的根对象

也许我误解了 API 但到目前为止,我发现 JSON.NET 中唯一可能的方法需要为所有 4 个 Class 编写自定义反序列化器,以便每个可以为嵌套在其中的 class 调用自定义反序列化器(即,A 的自定义反序列化器调用 B 的自定义反序列化器,等等)。当我真正想要的是自定义 Class D 的反序列化方式时,这将需要大量工作。

要为 JSON.NET 指定自定义反序列化器以用于特定 class,您可以使用 JsonConverter 属性来实现。在上述问题的示例中,Class D 的声明可能如下所示:

[JsonConverter(typeof(ClassDConverter))]
public class ClassD
{

}

其中 ClassDConverter 是自定义反序列化器,必须扩展 JsonConverter:

public class ClassDConverter : JsonConverter
{
     public override object ReadJson(...)
     {
           // custom deserialization code here
     }

     public override bool CanConvert(Type objectType)
     {
          return typeof(ClassD).isAssignableFrom(objectType);
     }

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

CanWrite returns false 因为我只想写一个解串器。如果您还希望它序列化,您可以覆盖 WriteJson 方法。

这是 Newtonsoft API 文档中的相关页面: http://www.newtonsoft.com/json/help/html/JsonConverterAttributeClass.htm

本网站在 de/serializing 枚举的上下文中提供了示例和其他详细信息: https://gooddevbaddev.wordpress.com/2013/08/26/deserializing-c-enums-using-json-net/