首頁 >後端開發 >C++ >如何在 C# 中將巢狀 JSON 屬性對應到類別屬性?

如何在 C# 中將巢狀 JSON 屬性對應到類別屬性?

Barbara Streisand
Barbara Streisand原創
2025-01-24 23:06:10442瀏覽

How to Map Nested JSON Properties to Class Properties in C#?

將 JSON 物件的子屬性對應到類別屬性

當遇到具有分層結構的 JSON 資料時,您可能想要將 JSON 複雜物件的子屬性對應到類別中的簡單屬性。雖然 Newtonsoft.Json 框架提供 [DataMember] 屬性來映射原始 JSON 數據,但它本身並不支援映射子屬性。

然而,有一些方法可以實現這種映射。一個簡單的方法是將 JSON 反序列化為 JObject,並使用 SelectToken 來檢索所需的子屬性。

例如,考慮以下 JSON 資料:

<code class="language-json">{
    "picture": {
        "id": 123456,
        "data": {
            "type": "jpg",
            "url": "http://www.someplace.com/mypicture.jpg"
        }
    }
}</code>

要將 url 子屬性對應到類別中的 ProfilePicture 屬性,可以使用以下程式碼:

<code class="language-csharp">string json = @"
{
    ""picture"": 
    {
        ""id"": 123456,
        ""data"": 
        {
            ""type"": ""jpg"",
            ""url"": ""http://www.someplace.com/mypicture.jpg""
        }
    }
}";

JObject jo = JObject.Parse(json);
Person p = jo.ToObject<Person>();
p.ProfilePicture = (string)jo.SelectToken("picture.data.url");</code>

如果您需要更進階的解決方案,您可以實現自訂 JsonConverter,使 JsonProperty 屬性能夠如預期般運作。此轉換器將使用反射根據屬性中指定的路徑填入所有屬性。

例如,考慮以下 JSON 資料:

<code class="language-json">{
  "name": "Joe Shmoe",
  "age": 26,
  "picture": {
    "id": 123456,
    "data": {
      "type": "jpg",
      "url": "http://www.someplace.com/mypicture.jpg"
    }
  },
  "favorites": {
    "movie": {
      "title": "The Godfather",
      "starring": "Marlon Brando",
      "year": 1972
    },
    "color": "purple"
  }
}</code>

要反序列化 JSON 並將子屬性對應到類別中的簡單屬性,可以使用以下自訂轉換器:

<code class="language-csharp">[JsonConverter(typeof(JsonPathConverter))]
class Person
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("age")]
    public int Age { get; set; }

    [JsonProperty("picture.data.url")]
    public string ProfilePicture { get; set; }

    [JsonProperty("favorites.movie")]
    public Movie FavoriteMovie { get; set; }

    [JsonProperty("favorites.color")]
    public string FavoriteColor { get; set; }
}</code>

有了自訂轉換器,您可以像往常一樣反序列化 JSON:

<code class="language-csharp">Person p = JsonConvert.DeserializeObject<Person>(json);</code>

以上是如何在 C# 中將巢狀 JSON 屬性對應到類別屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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