C#/ Unity

时间:2017-01-19 22:03:59

标签: c# json unity3d serialization deserialization

我在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(否则,只是正常进行)?

1 个答案:

答案 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);