如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]
Posted
技术标签:
【中文标题】如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]【英文标题】:How to correctly deserialize nested object in array with Newtonsoft.Json? [duplicate] 【发布时间】:2021-10-06 00:19:13 【问题描述】:我面对的是这个 json 数据:
"pagemeta":
"slug": "/",
"title": "test",
"description": "test"
,
"navigationlinks":
"links": [
"navigationlink":
"name": "Index.",
"url": "/"
]
两者都使用HttpRespondeMessage.Content.ReadAsJsonAsync<T>();
或JsonConvert.DeserializeAnonymousType(jsonString, new MyClassToDeserializeInto())
两种解析似乎都运行良好,除非涉及到数组 "links"
中的对象。
这些确实会成为类中数组中的对象,但所有数据都是null
(name
和url
都像本例一样)。
我做错了什么没有正确反序列化 json 吗?
以下是我用作最终目标对象的类:
HomeData.cs
public sealed class HomeData
[JsonProperty("pagemeta")]
public PageMeta PageMeta get; set;
[JsonProperty("navigationlinks")]
public NavigationLinks NavigationLinks get; set;
NavigationLinks.cs
public class NavigationLinks
[JsonProperty("links")]
public NavigationLink[] Links get; set;
NavigationLink.cs
public class NavigationLink
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("url")]
public string Url get; set;
同时PageMeta.cs
正确处理数据。
【问题讨论】:
您的数据模型不正确。将您的 JSON 上传到 How to auto-generate a C# class file from a JSON string 中建议的工具之一,例如 json2csharp.com 或 app.quicktype.io,您将获得正确的数据模型。 如这些工具所示,您需要一个额外级别的具有"navigationlink"
属性的容器,例如public partial class Navigationlinks [JsonProperty("links")] public Link[] Links get; set;
包含额外级别 public partial class Link [JsonProperty("navigationlink")] public Navigationlink Navigationlink get; set;
我将自动生成的类从json2csharp.com复制到dotnetfiddle.net/UKxxpB,你的JSON可以成功反序列化。 json2csharp 与user3026017 的the answer 做同样的事情,即使用public Navigationlink Navigationlink get; set;
属性添加额外的对象级别。作为副本关闭。
【参考方案1】:
你错过了Links类,把Links类标记为JsonObject
public sealed class HomeData
[JsonProperty("pagemeta")]
public PageMeta PageMeta get; set;
[JsonProperty("navigationlinks")]
public NavigationLinks NavigationLinks get; set;
public class PageMeta
[JsonProperty("slug")]
public string Slug get; set;
[JsonProperty("title")]
public string Title get; set;
[JsonProperty("description")]
public string Description get; set;
public class NavigationLink
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("url")]
public string Url get; set;
public class NavigationLinks
[JsonProperty("links")]
public Links[] Links get; set;
[JsonObject]
public class Links
[JsonProperty("navigationlink")]
public NavigationLink NavigationLink get; set;
然后像这样使用它:
var homedata = JsonConvert.DeserializeAnonymousType(text, new HomeData());
【讨论】:
但是 Links 不是 jsonObject 它是 jsonArray NavigationLinks 包含链接数组..以上是关于如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?
NewtonSoft.JSON 反序列化 - 未正确反序列化。 (VB.NET)
如何使用 C# 进行条件序列化 - NewtonSoft.Json
如何使用 Newtonsoft.JSON 解析 JSON 响应? [复制]