首页 > 后端开发 > C++ > 如何在没有类型信息的情况下在JSON.NET中执行多态性JSON避难所?

如何在没有类型信息的情况下在JSON.NET中执行多态性JSON避难所?

Barbara Streisand
发布: 2025-02-02 12:01:11
原创
462 人浏览过

How Can I Perform Polymorphic JSON Deserialization in Json.NET Without Type Information?

Json.NET无类型信息的多态JSON反序列化

Json.NET强大的功能允许即使在没有类型信息的情况下也能反序列化多态JSON数据。这在处理返回不同对象类型混合的数据源时尤其有用,例如,Imgur API同时返回Gallery Image和Gallery Album类的情况。

为了实现这一点,我们创建了一个自定义JsonConverter来处理对象实例化过程。首先,我们定义我们的GalleryItem基类及其派生类GalleryImage和GalleryAlbum:

public abstract class GalleryItem
{
    public string id { get; set; }
    public string title { get; set; }
    public string link { get; set; }
    public bool is_album { get; set; }
}

public class GalleryImage : GalleryItem
{
    // 附加的图像特定属性
}

public class GalleryAlbum : GalleryItem
{
    public int images_count { get; set; }
    public List<GalleryImage> images { get; set; }
}
登录后复制

接下来,我们实现我们的JsonConverter,GalleryItemConverter:

public class GalleryItemConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(GalleryItem).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // 解析包含数据的JSON对象
        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();

        // 使用JsonSerializer填充对象的属性
        serializer.Populate(jo.CreateReader(), item);

        return item;
    }

    // 对于我们的目的,不需要实现CanWrite和WriteJson
}
登录后复制

转换器检查是否存在“is_album”属性以确定要实例化的类型。然后,它使用JsonSerializer根据JSON对象中的数据填充对象的属性。

为了演示其用法,我们定义了一个解析提供的示例数据的示例程序:

string json = @"
[
    {
        ""id"": ""OUHDm"",
        ""title"": ""My most recent drawing. Spent over 100 hours."",
        ""link"": ""http://i.imgur.com/OUHDm.jpg"",
        ""is_album"": false
    },
    {
        ""id"": ""lDRB2"",
        ""title"": ""Imgur Office"",
        ""link"": ""http://alanbox.imgur.com/a/lDRB2"",
        ""is_album"": true,
        ""images_count"": 3,
        ""images"": [
            {
                ""id"": ""24nLu"",
                ""link"": ""http://i.imgur.com/24nLu.jpg""
            },
            {
                ""id"": ""Ziz25"",
                ""link"": ""http://i.imgur.com/Ziz25.jpg""
            },
            {
                ""id"": ""9tzW6"",
                ""link"": ""http://i.imgur.com/9tzW6.jpg""
            }
        ]
    }
]";

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

程序的输出展示了Gallery Image和Gallery Album对象的成功反序列化,以及它们各自属性的准确填充。

通过这种方式,自定义JsonConverter允许我们处理多态JSON反序列化,而无需显式类型信息,使我们能够与不同的数据源无缝协作。

以上是如何在没有类型信息的情况下在JSON.NET中执行多态性JSON避难所?的详细内容。更多信息请关注PHP中文网其他相关文章!

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