使用属性访问 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中文网其他相关文章!