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

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

DDD
发布: 2025-02-02 11:56:10
原创
224 人浏览过

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类:

{
    "id": "OUHDm",
    "title": "My most recent drawing. Spent over 100 hours.",
    "is_album": false
}
登录后复制

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

解决方案:自定义JsonConverter

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

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

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;
    }
}
登录后复制

与JSON.NET反序列化的用法

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

var items = JsonConvert.DeserializeObject<List<GalleryItem>>(json, new GalleryItemConverter());
登录后复制

示例输出

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

// 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);
登录后复制

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板