首頁 > 後端開發 > C++ > 如何在 C# 中使用動態命名子物件反序列化 JSON?

如何在 C# 中使用動態命名子物件反序列化 JSON?

Patricia Arquette
發布: 2025-01-13 18:52:45
原創
762 人瀏覽過

How to Deserialize JSON with Dynamically Named Child Objects in C#?

C#中動態命名子物件的JSON反序列化

處理具有動態命名子物件的JSON結構的反序列化可能面臨挑戰。考慮以下JSON範例:

<code class="language-json">{
    "users": {
        "parentname": "test",
        "100034": {
            "name": "tom",
            "state": "WA",
            "id": "cedf-c56f-18a4-4b1"
        },
        "10045": {
            "name": "steve",
            "state": "NY",
            "id": "ebb2-92bf-3062-7774"
        },
        "12345": {
            "name": "mike",
            "state": "MA",
            "id": "fb60-b34f-6dc8-aaf7"
        }
    }
}</code>
登入後複製

嘗試使用以下程式碼進行反序列化可能會失敗:

<code class="language-csharp">public class RootObject
{
    public string ParentName { get; set; }
    public Dictionary<string, User> users { get; set; }
}

public class User
{
    public string name { get; set; }
    public string state { get; set; }
    public string id { get; set; }
}</code>
登入後複製

這是因為RootObject類別中已知的屬性名稱與JSON中子物件的動態名稱不符。

解決方案是使用自訂轉換器來處理動態屬性名稱並將它們反序列化為強類型物件的字典。為此,需要:

  1. 建立一個繼承自JsonConverter的轉換器類,並提供反序列化和序列化的邏輯:

    <code class="language-csharp"> public class TypedExtensionDataConverter<T> : JsonConverter // ... 实现略 ...</code>
    登入後複製
  2. 使用[JsonTypedExtensionData]屬性標記資料模型中將保存動態命名物件的字典的屬性:

    <code class="language-csharp"> [JsonConverter(typeof(TypedExtensionDataConverter<User>))]
     class Users
     {
         [JsonProperty("parentname")]
         public string ParentName { get; set; }
    
         [JsonTypedExtensionData]
         public Dictionary<string, User> UserTable { get; set; }
     }</code>
    登入後複製
  3. 更新資料模型以正確處理動態子物件:

    <code class="language-csharp"> public class RootObject
     {
         [JsonProperty("users")]
         public Users Users { get; set; }
     }</code>
    登入後複製

透過使用自訂轉換器,可以成功地將JSON結構反序列化為強型別的C#物件模型,從而保留原始資料的層次結構和動態特性。

以上是如何在 C# 中使用動態命名子物件反序列化 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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