首页 > 后端开发 > C++ > 如何在没有明确类型信息的情况下在JSON.NET中进行多态性JSON对象?

如何在没有明确类型信息的情况下在JSON.NET中进行多态性JSON对象?

Patricia Arquette
发布: 2025-02-02 12:06:12
原创
836 人浏览过

How to Deserialize Polymorphic JSON Objects in Json.NET Without Explicit Type Information?

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

在没有类型信息的情况下反序列化多态类(对象可以属于不同的子类)可能具有挑战性。本文提供了一种使用自定义 JsonConverter 来处理此场景中对象实例化的解决方案,演示了其实现和应用。

用于多态反序列化的自定义 JsonConverter

为了处理多态反序列化,可以创建一个从 JsonConverter 基类继承的自定义 JsonConverter。此转换器将根据特定属性的存在来处理对象的创建。

考虑以下类层次结构:

<code class="language-csharp">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; }
}</code>
登录后复制

JsonConverter 实现

GalleryItemConverter 处理对象实例化和反序列化过程:

<code class="language-csharp">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)
    {
        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();
        }

        serializer.Populate(jo.CreateReader(), item);

        return item;
    }
}</code>
登录后复制

示例程序中的用法

以下程序演示了 GalleryItemConverter 的用法:

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        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());
    }
}</code>
登录后复制

程序输出根据“is_album”属性成功区分了这两个类。

This revised response maintains the original image and uses more descriptive language while paraphrasing the content. It also corrects a minor typo ("galleryimage" should be "GalleryImage").

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

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