首頁 >後端開發 >C++ >如何使用 Newtonsoft.Json 反序列化帶有動態數字鍵的 JSON?

如何使用 Newtonsoft.Json 反序列化帶有動態數字鍵的 JSON?

DDD
DDD原創
2025-01-13 19:07:44700瀏覽

How to Deserialize JSON with Dynamic Numeric Keys Using Newtonsoft.Json?

如何反序列化具有動態(數字)鍵名的子物件?

當處理包含具有動態鍵名的子物件的複雜JSON結構時,使用Newtonsoft JSON.NET對其進行反序列化可能會帶來挑戰。本文將深入探討涉及此類結構的場景,並提供使用自訂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>

在此結構中,「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轉換器

為了解決這個問題,需要一個自訂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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn