我在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
,它允许你调用你想要反序列化的类的构造函数(内置的反序列化器完成剩下的工作)但是我不确定我能在哪里进行任何内省的顺序决定构建哪个子类。
感谢您的任何建议!
更新:在评论中,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(否则,只是正常进行)?
答案 0 :(得分:0)
我找到了解决问题的方法。
使用此处的说明编写自定义序列化程序:How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?
假设您的序列化程序被调用CustomConverter
(它必须退出JsonConverter
...请参阅上面的链接。
将此序列化程序添加到转换器中,然后正常调用Deserialize&lt;&gt;():
JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new CustomConverter());
YourClass deserializedObject = serializer.Deserialize<YourClass>(jsonReader);