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中子物件的動態名稱不符。
解決方案是使用自訂轉換器來處理動態屬性名稱並將它們反序列化為強類型物件的字典。為此,需要:
建立一個繼承自JsonConverter
的轉換器類,並提供反序列化和序列化的邏輯:
<code class="language-csharp"> public class TypedExtensionDataConverter<T> : JsonConverter // ... 实现略 ...</code>
使用[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>
更新資料模型以正確處理動態子物件:
<code class="language-csharp"> public class RootObject { [JsonProperty("users")] public Users Users { get; set; } }</code>
透過使用自訂轉換器,可以成功地將JSON結構反序列化為強型別的C#物件模型,從而保留原始資料的層次結構和動態特性。
以上是如何在 C# 中使用動態命名子物件反序列化 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!