如何使用Newtonsoft.Json正确反序列化数组中的嵌套对象(解决字段为空问题)
问题根源:JSON结构与实体类映射不匹配
你遇到的问题核心是JSON里的links数组元素结构和你的NavigationLink类不对应。仔细看你的JSON:
"links": [{ "navigationlink": { "name": "Index.", "url": "/" } }]
每个links元素并不是直接包含name和url的对象,而是被一个名为navigationlink的外层属性包裹的对象。但你的NavigationLink类直接声明了name和url字段,反序列化器找不到对应的映射关系,自然会把这两个值设为null。
解决方案:调整实体类匹配JSON结构
有两种简单的修复方式,选哪种都可以:
方式1:新增包装类适配层级
创建一个专门的包装类来对应links数组里的外层结构,再嵌套你的NavigationLink类:
修改后的NavigationLinks.cs
public class NavigationLinks { [JsonProperty("links")] // 把数组类型改成包装类数组 public NavigationLinkWrapper[] Links { get; set; } }
新增NavigationLinkWrapper.cs
public class NavigationLinkWrapper { [JsonProperty("navigationlink")] public NavigationLink NavigationLink { get; set; } }
你的原NavigationLink.cs可以保持不变,之后解析时就能通过Links[i].NavigationLink.Name和Links[i].NavigationLink.Url拿到对应值了。
方式2:直接修改NavigationLink类适配层级
如果你不想新增类,也可以直接调整NavigationLink的结构来匹配JSON:
public class NavigationLink { [JsonProperty("navigationlink")] public NavigationLinkDetails Details { get; set; } } public class NavigationLinkDetails { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("url")] public string Url { get; set; } }
这种方式下,解析后需要通过Links[i].Details.Name来访问数据。
验证修复效果
修改完实体类后,再用你原来的两种解析方式试试:
HttpRespondeMessage.Content.ReadAsJsonAsync<HomeData>()JsonConvert.DeserializeAnonymousType(jsonString, new HomeData())
这时候links数组里的name和url就能正确被反序列化出来了,不会再是null。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

