【发布时间】:2017-06-04 18:53:48
【问题描述】:
我在 Unity 中工作并尝试反序列化 JSON。
JSON 是从如下所示的数据结构中序列化的(使用 Java 代码):
A 类的对象数组,其中
A 类包含 B 类对象的数组,并且
B 类包含 C 类对象的数组,并且
C 类包含零个或一个 D 类对象
内置的 Unity 反序列化器 JsonUtility 可以很好地反序列化除 D 类以外的数据结构,因为 D 类使用多态性。更具体地说,D类实际上是一个接口,被反序列化的对象要么是子类D1,要么是子类D2。
有没有一种方法可以为 D 类编写自定义反序列化程序,并且只为 D 类编写?我很高兴让内置库处理反序列化 A 类到 C 类,但我需要做一些特殊的事情来反序列化 D 类。
在 Java 中这很简单,因为我能够注册一个自定义的反序列化器,只要 D 类的对象被反序列化/序列化,就会调用该反序列化器。在那个反序列化器中,我能够进行一些内省,看看我们正在处理什么类型的子类(例如,它是 D1 还是 D2?)并适当地反序列化它。
我不确定如何在 Unity(或 C#)中执行此操作。
我研究了 MiniJSON、LitJSON、SimpleJSON 和 NewtonSoft 的 JSON.NET,但我没有找到任何可以让您为类编写自定义反序列化程序的东西(也许我错过了?)。
我找到的最接近的是 JSON.NET 的 CustomCreationConvertor:
http://www.newtonsoft.com/json/help/html/CustomCreationConverter.htm
它可以让你调用你想要反序列化到的类的构造函数(内置的反序列化器会完成剩下的工作),但我不确定我可以在哪里进行任何自省以确定哪个子类构建。
感谢您的任何建议!
更新:在 cmets 中,Abion47 发布了这个:How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?
该线程向我展示了如何为 D 类编写反序列化器。但仍然存在一个问题:如何调用自定义反序列化器?在给出的示例中,自定义反序列化器的调用方式如下:
D sampleD = JsonConvert.DeserializeObject<D>(json, new CustomDConverter());
自定义反序列化器已传入。但是,如果我还想使用 C 类的内置反序列化器,其中嵌套了 D 类,我该怎么做?
有什么方法可以告诉 JSON.NET 我希望它在遇到 D 类对象时使用 CustomDConverter(否则,只需正常进行)?
【问题讨论】:
-
谢谢。我认为该线程可能会回答我的问题,尽管我必须花一些时间阅读和消化才能确定!
-
我认为链接 Abion47 将解决我如何为 D 类编写自定义解串器的问题。但是,由于 D 类嵌套在 C 类中,我如何使用我的自定义解串器?我是否需要为 C 类编写自定义反序列化器,以便手动调用 D 类的反序列化器?
标签: c# json unity3d serialization deserialization