首页 >后端开发 >C++ >如何使用JSON.NET进行类型信息的情况下进行序列化多态性JSON?

如何使用JSON.NET进行类型信息的情况下进行序列化多态性JSON?

DDD
DDD原创
2025-02-02 11:56:10150浏览

How to Deserialize Polymorphic JSON Without Type Information Using JSON.NET?

无需类型信息使用JSON.NET反序列化多态JSON类

Json.NET是一个功能强大的.NET JSON序列化和反序列化库。但是,当序列化数据中没有类型信息时,反序列化多态JSON可能具有挑战性。

问题:缺少类型信息

多态性允许多个类继承自一个公共基类。当反序列化表示多态对象的JSON数据时,如果没有类型信息,很难确定应该实例化哪个类。

例如,考虑以下JSON数据,它表示Gallery Image或Gallery Album类:

<code class="language-json">{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
    "is_album": false
}</code>

"is_album"属性区分这两个类。Gallery Images的"is_album"设置为false,而Gallery Albums设置为true。

解决方案:自定义JsonConverter

要反序列化这种多态JSON,您可以创建一个自定义JsonConverter来处理对象实例化。转换器检查"is_album"属性并创建相应的类实例。

这是一个名为GalleryItemConverter的示例转换器:

<code class="language-csharp">public class GalleryItemConverter : JsonConverter
{
    // 指定转换器可以转换GalleryItem及其派生类
    public override bool CanConvert(Type objectType) => typeof(GalleryItem).IsAssignableFrom(objectType);

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 将JSON读取为JObject
        JObject jo = JObject.Load(reader);

        // 检查"is_album"属性以确定类类型
        bool? isAlbum = (bool?)jo["is_album"];

        GalleryItem item;
        if (isAlbum.GetValueOrDefault())
            item = new GalleryAlbum();
        else
            item = new GalleryImage();

        // 从JSON数据填充项目属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}</code>

与JSON.NET反序列化的用法

要使用转换器,请将其作为参数包含在默认JSON.NET反序列化器中,如下所示:

<code class="language-csharp">var items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());</code>

示例输出

使用提供的JSON数据和自定义转换器,您可以获得反序列化的GalleryItem对象:

<code class="language-csharp">// Gallery Image
Console.WriteLine("ID: {0}, Title: {1}, Link: {2}", items[0].id, items[0].title, items[0].link);

// Gallery Album
Console.WriteLine("ID: {0}, Title: {1}, Link: {2}, Images: {3}", items[1].id, items[1].title, items[1].link, items[1].images.Count);</code>

以上是如何使用JSON.NET进行类型信息的情况下进行序列化多态性JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn