首页 > 后端开发 > C++ > 如何使用自定义JSONCONVERTER将多态性JSON数据列为基础类列表?

如何使用自定义JSONCONVERTER将多态性JSON数据列为基础类列表?

Mary-Kate Olsen
发布: 2025-02-02 08:31:09
原创
226 人浏览过

How to Deserialize Polymorphic JSON Data into a List of Base Classes using a Custom JsonConverter?

使用自定义JsonConverter转换子类

目标

本指南旨在解决使用自定义JsonConverter将多态数据反序列化为基类列表的难题。在本例中,我们有一个基类Person和子类Employee和Artist,每个子类都有其独特的属性。

实现

标准的CustomCreationConverter不足以完成此任务,因为它无法根据JSON对象分析确定正确的类型。相反,我们需要:

  1. 继承JsonConverter并重写ReadJson方法。
  2. 创建一个抽象的Create方法,该方法接受一个JObject(表示JSON对象)。

ReadJson方法将:

  1. 将JSON解析为JObject。
  2. 调用Create方法,传入JObject。

Create方法将:

  1. 分析JObject以根据特定字段的存在或不存在来确定正确的类型。
  2. 返回相应类型的实例。

示例

考虑以下JSON:

<code>[{
        "Department": "Department1",
        "JobTitle": "JobTitle1",
        "FirstName": "FirstName1",
        "LastName": "LastName1"
    },{
        "Department": "Department2",
        "JobTitle": "JobTitle2",
        "FirstName": "FirstName2",
        "LastName": "LastName2"
    },
        {"Skill": "Painter",
        "FirstName": "FirstName3",
        "LastName": "LastName3"
    }]</code>
登录后复制
<code class="language-csharp">string json = "[...]";
List<Person> persons = 
    JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());</code>
登录后复制
<code class="language-csharp">public class PersonConverter : JsonCreationConverter<Person>
{
    protected override Person Create(Type objectType, JObject jObject)
    {
        if (FieldExists("Skill", jObject))
        {
            return new Artist();
        }
        else if (FieldExists("Department", jObject))
        {
            return new Employee();
        }
        else
        {
            return new Person();
        }
    }

    private bool FieldExists(string fieldName, JObject jObject)
    {
        return jObject[fieldName] != null;
    }
}

public abstract class JsonCreationConverter<T> : JsonConverter
{
    protected abstract T Create(Type objectType, JObject jObject);

    public override bool CanConvert(Type objectType) => typeof(T).IsAssignableFrom(objectType);

    public override bool CanWrite => false;

    public override object ReadJson(JsonReader reader, 
                                    Type objectType, 
                                     object existingValue, 
                                     JsonSerializer serializer)
    {
        JObject jObject = JObject.Load(reader);
        T target = Create(objectType, jObject);
        serializer.Populate(jObject.CreateReader(), target);
        return target;
    }
}</code>
登录后复制

以上是如何使用自定义JSONCONVERTER将多态性JSON数据列为基础类列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

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