【问题标题】:Custom JSON de/serializer in C# / UnityC#/Unity 中的自定义 JSON 反序列化器
【发布时间】: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


【解决方案1】:

我找到了问题的解决方案。

使用此处的说明编写自定义序列化程序:How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?

假设您的序列化程序被称为CustomConverter(它必须扩展为JsonConverter ...见上面的链接)。

将此序列化程序添加到您的转换器,然后正常调用 Deserialize():

JsonSerializer serializer = new JsonSerializer();
serializer.Converters.Add(new CustomConverter());

YourClass deserializedObject = serializer.Deserialize<YourClass>(jsonReader);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多