當處理包含具有動態鍵名的子物件的複雜JSON結構時,使用Newtonsoft JSON.NET對其進行反序列化可能會帶來挑戰。本文將深入探討涉及此類結構的場景,並提供使用自訂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>
在此結構中,「users」物件包含已知屬性(「parentname」)和未知屬性(具有表示子物件的數字鍵)的混合。目標是將此結構反序列化為C#物件模型,其中子物件表示為強類型類別。
使用標準JSON.NET程式碼反序列化JSON的初始嘗試可能如下所示:
<code class="language-csharp">class RootObject { public string ParentName { get; set; } public Dictionary<string, User> users { get; set; } } class User { public string name { get; set; } public string state { get; set; } public string id { get; set; } }</code>
由於「users」物件中的未知屬性,反序列化到此物件模型會失敗。 JSON.NET預設期望屬性名稱與類別屬性匹配,由於數字鍵與User類別中的任何屬性都不對應,因此反序列化過程失敗。
為了解決這個問題,需要一個自訂JSON轉換器。 TypedExtensionDataConverter
優雅地解決了這個問題。以下是代碼:
<code class="language-csharp">public class TypedExtensionDataConverter<T> : JsonConverter { // ... [此处省略实现,篇幅原因] }</code>
此轉換器允許將未知屬性反序列化到類型化容器中,在本例中為User物件的字典:
<code class="language-csharp">[JsonConverter(typeof(TypedExtensionDataConverter<Users>))] class Users { public Users() { this.UserTable = new Dictionary<string, User>(); } [JsonProperty("parentname")] public string ParentName { get; set; } [JsonTypedExtensionData] public Dictionary<string, User> UserTable { get; set; } }</code>
透過使用JsonTypedExtensionDataAttribute
,轉換器知道將未知屬性序列化/反序列化到UserTable
字典中。
有了自訂轉換器,完整的解決方案如下所示:
<code class="language-csharp">class RootObject { [JsonProperty("users")] public Users Users { get; set; } } [JsonConverter(typeof(TypedExtensionDataConverter<Users>))] class Users { // ... [如上实现] } class User { // ... [不变] }</code>
現在,反序列化JSON結構將使用預期的值填充RootObject
,包括儲存在Users
物件中UserTable
字典中的子物件。
以上是如何使用 Newtonsoft.Json 反序列化帶有動態數字鍵的 JSON?的詳細內容。更多資訊請關注PHP中文網其他相關文章!