使用屬性存取 JSON 中的子屬性?
使用 Newtonsoft.Json 的 DeserializeObject<T>
進行 JSON 反序列化允許使用 [DataMember(Name = "raw_property_name")]
將原始 JSON 資料對應到類別屬性。但是,如果您想將複雜 JSON 物件的子屬性對應到類別中的簡單屬性,該怎麼辦?
例如,考慮以下 JSON:
<code class="language-json">{ "picture": { "id": 123456, "data": { "type": "jpg", "url": "http://www.someplace.com/mypicture.jpg" } } }</code>
您可能只對 picture
物件的 url
屬性感興趣,因此您不想在類別中建立複雜的物件。您可以像這樣簡單地映射它嗎?
<code class="language-csharp">[DataMember(Name = "picture.data.url")] public string ProfilePicture { get; set; }</code>
使用 JObject 進行直接路徑對應
一個簡單的方法是將 JSON 解析為 JObject
。然後,使用 ToObject()
從 JObject
填入您的類別。要提取額外的屬性,請使用 SelectToken()
:
<code class="language-csharp">string json = @" { ""name"" : ""Joe Shmoe"", ""age"" : 26, ""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
或者,您可以建立一個自訂 JsonConverter
來啟用 JsonProperty
屬性,以根據您的需求來對應子屬性:
<code class="language-csharp">class JsonPathConverter : JsonConverter { // ... 实现代码在问题答案中提供 ... }</code>
使用方法如下:
<code class="language-csharp">[JsonConverter(typeof(JsonPathConverter))] class Person { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("picture.data.url")] public string ProfilePicture { get; set; } // ... 其他属性 ... } Person p = JsonConvert.DeserializeObject<Person>(json);</code>
這允許您對子屬性使用基於屬性的映射,從而在將 JSON 資料反序列化為類別物件時提供更大的靈活性。
以上是我可以使用屬性將子 JSON 屬性對應到類別屬性嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!