将 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中文网其他相关文章!