使用 Newtonsoft 访问对象内的数组

Posted

技术标签:

【中文标题】使用 Newtonsoft 访问对象内的数组【英文标题】:Access an array inside an object using Newtonsoft 【发布时间】:2021-12-16 10:48:26 【问题描述】:

请查看下面的 JSON,我已使用 https://jsonlint.com/ 进行了验证:


        "People": 
            "data": [
                    "id": "1",
                    "name": "Bert"
                ,
                
                    "id": "2",
                    "name": "Brian"
                ,
                
                    "id": "3",
                    "name": "Maria"
                
            ]
        
    

我正在尝试将此 JSON 反序列化为这样的类:

 public class Person
    
        public string id;
        public string name
    

到目前为止,我已经尝试过:

public static List<Person> DeserializePeople(string json)
        
            var jo = JObject.Parse(json);
            return jo["data"]["People"]
                .Select(s => new Person
                
                    id = ((string)s[0] == null) ? "" : (string)s[0],
                    name = ((string)s[1] == null) ? "" : (string)s[1],
                )
                .ToList();
        

【问题讨论】:

【参考方案1】:

试试这个

var jsonDeserialized= JsonConvert.DeserializeObject<Root>(json); 

List<Person> persons=jsonDeserialized.People.Persons;

如果您只需要人员列表,则只需一行

List<Person> persons = jsonConvert.DeserializeObject<Root>(json).People.Persons;

输出

    1   Bert
    2   Brian
    3   Maria

类,你需要使用getter /setter

public class Person

    [JsonProperty("id")]
    public long Id  get; set; 

    [JsonProperty("name")]
    public string Name  get; set; 


public class People
 
    [JsonProperty("data")]
    public List<Person> Persons  get; set; 


public class Root

    public People People  get; set; 

【讨论】:

这是我在上面得到的错误:“Newtonsoft.Json.JsonSerializationException:'无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型'Person',因为类型需要一个 JSON 对象(例如 "name":"value")才能正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 "name":"value"... @w0051977 你的课程有错误,使用我的课程来避免错误 忽略我最后的评论。您的代码有效 - 谢谢。 +1 以获得全面的答案。 @w0051977 不客气

以上是关于使用 Newtonsoft 访问对象内的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?

如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]

Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息

使用 Newtonsoft 反序列化未命名数组的 JSON 数组

如何在 Vue3 中使用数组访问反应对象内的数据?

使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]