【问题标题】:Specify a custom deserializer for one class inside a data structure and leave the rest to the default deserializer为数据结构中的一个类指定自定义反序列化器,并将其余部分留给默认反序列化器
【发布时间】:2017-01-20 18:27:58
【问题描述】:

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

使用 JSON.NET,有没有办法只为 D 类“注册”一个自定义反序列化器——允许默认反序列化器处理 A 到 C 类——然后通过一个方法调用反序列化整个数据结构反序列化A类的根对象?

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

【问题讨论】:

  • 你想实现什么样的定制?
  • 我想你说的是something like this
  • @ChetanRanpariya 我想要实现的自定义是 D 实际上是一个具有两个子类型 D1 和 D2 的接口,我想在反序列化之前检查它是哪个。这里解释了进行这种特定类型的自定义的方法:stackoverflow.com/questions/8030538/… 所以我知道如何编写自定义反序列化程序,但现在我想知道如何“注册”它以便在反序列化期间调用它,而默认反序列化程序处理数据结构的其余部分。
  • @MikeMcCaughan 感谢您的链接。我不确定它是否回答了我的问题。我仍然想反序列化整个数据流。我只希望默认的反序列化器完成大部分工作,而我只编写处理反序列化 D 类的部分。您提供的链接是否解释了如何实现这一点?谢谢!
  • 好吧,它告诉您如何获取 JSON 的特定部分并仅反序列化这些部分。我想您可以使用默认的反序列化器进行反序列化,然后用您的自定义反序列化对象填写“错误”反序列化的“D 类”。那是反序列化两次,但我不确定如何告诉默认反序列化器什么类是什么。看起来this question 也在问类似的问题。

标签: c# json serialization json-deserialization


【解决方案1】:

要为 JSON.NET 指定用于特定类的自定义反序列化器,您可以使用 JsonConverter 属性来执行此操作。在上述问题的示例中,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 返回false 因为我只想写一个反序列化器。如果您还希望它序列化,您可以覆盖 WriteJson 方法。

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

本网站提供了反序列化枚举的示例和其他详细信息: https://gooddevbaddev.wordpress.com/2013/08/26/deserializing-c-enums-using-json-net/

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2017-09-10
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多