首頁 > 後端開發 > C++ > 如何使用自定義JSON.NET轉換器進行多態性JSON數據進行序列化?

如何使用自定義JSON.NET轉換器進行多態性JSON數據進行序列化?

Barbara Streisand
發布: 2025-02-02 08:41:08
原創
433 人瀏覽過

使用自定義 JSON.NET 轉換器反序列化多態 JSON 數據

自定義 JSON.NET 轉換器提供了一種強大的機制來定制序列化和反序列化過程。它允許開發人員擴展 JSON.NET 的功能,以處理更複雜的數據類型或場景。

一種這樣的場景出現在處理多態性時,其中不同的類型繼承自基類。考慮以下示例:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
    public string JobTitle { get; set; }
}

public class Artist : Person
{
    public string Skill { get; set; }
}
登入後複製

現在,假設我們有一個 Person 對象列表的 JSON 表示,包括 Employee 和 Artist 的實例。

[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]
登入後複製

我們如何將此 JSON 反序列化為 List<Person>,同時正確識別每個人的具體類型?

自定義轉換器解決方案

標準的 CustomCreationConverter 沒有提供一種基於 JSON 內容確定正確類型的方法。但是,我們可以通過重寫 ReadJson 方法並引入一個新的抽象 Create 方法(該方法接受一個 JObject)來創建我們自己的自定義轉換器:

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

    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;
    }
}
登入後複製

在我們的特定場景中,我們創建了一個擴展 JsonCreationConverter<Person>PersonConverter

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;
    }
}
登入後複製

使用此自定義轉換器,我們可以反序列化 JSON 字符串:

string json = "[...]"; //  此处应替换为实际的JSON字符串
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
登入後複製

PersonConverter 將分析 JSON 內容,確定每個人的正確類型,並相應地創建 EmployeeArtistPerson 的實例。這允許無縫反序列化多態數據結構。

How to Deserialize Polymorphic JSON Data Using a Custom JSON.NET Converter?

以上是如何使用自定義JSON.NET轉換器進行多態性JSON數據進行序列化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板