首頁 >後端開發 >C++ >如何使用自定義JSONCONVERTER將多態性JSON數據列為基礎類列表?

如何使用自定義JSONCONVERTER將多態性JSON數據列為基礎類列表?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-02 08:31:09277瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn