首頁 > 後端開發 > C++ > 如何在JSON.NET中實現自定義JSONCONVERTER進行多態性的驗證?

如何在JSON.NET中實現自定義JSONCONVERTER進行多態性的驗證?

Susan Sarandon
發布: 2025-02-02 08:36:11
原創
980 人瀏覽過

How to Implement a Custom JsonConverter in JSON.NET for Polymorphic Deserialization?

利用JSON.NET自定義JsonConverter處理多態反序列化

在JSON.NET中處理多態類型時,當JSON中未明確定義類型時,將JSON數據反序列化回強類型對象可能具有挑戰性。本指南演示如何實現自定義JsonConverter來克服此障礙。

挑戰

考慮以下JSON數據:

[
  {
    "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>,其中Person是基類,EmployeeArtist是派生類。

解決方案

為了處理這種情況,我們將創建一個名為PersonConverter的自定義JsonConverter類,它繼承自JsonCreationConverter<Person>JsonCreationConverter<T>類是在從JSON數據推斷反序列化值的類型時使用的自定義轉換器。

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

ReadJson方法重寫

在我們的自定義PersonConverter中,重寫ReadJson方法以執行以下步驟:

  1. 將JSON數據讀取到JObject中。
  2. 調用Create方法根據JSON屬性確定類型。
  3. 使用JsonSerializer.Populate方法填充對象的屬性。
  4. 返回新創建的對象。

使用轉換器

要使用自定義轉換器,您可以使用以下代碼:

string json = "{ ... }"; // 使用实际的JSON数据替换
List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());
登入後複製

結論

通過實現自定義JsonConverter,您可以處理JSON.NET中的多態反序列化。本指南中提供的PersonConverter演示瞭如何分析JSON數據並確定適當的派生類型。這種方法能夠在反序列化期間靈活地處理多態關係。

以上是如何在JSON.NET中實現自定義JSONCONVERTER進行多態性的驗證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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