如何使用 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" 中的对象。

这些确实会成为类中数组中的对象,但所有数据都是nullnameurl 都像本例一样)。

我做错了什么没有正确反序列化 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 响应? [复制]

如何使用 Newtonsoft.Json 反序列化 JSON 数组

如何使用Newtonsoft.Json生成这样的json字符串