简体   繁体   English

使用JSON.NET解析C#中的JSON时,如何从列表中获取属性?

[英]How do I get a property from a list when parsing JSON in C# with JSON.NET?

I'm able to parse simple properties using JSON.NET with this C# code: 我可以使用带有此C#代码的JSON.NET解析简单属性:

Code C# 代码C#

    WebClient c = new WebClient();
    var data = c.DownloadString("http://localhost/json1.json");
    JObject o = JObject.Parse(data);
    listBox1.Items.Add(o["name"]);
    listBox1.Items.Add(o["email"][0]);
    listBox1.Items.Add(o["email"][1]);
    listBox1.Items.Add(o["website"]["blog"]);

json1.json json1.json

{
    "name": "Fname Lname",
    "email": [
            "email@gmail.com",
            "email@hotmail.com"
    ],
    "website":
    {
            "blog": "example.com"
    }
}

json2.json json2.json

{
"name": "Fname Lname",
"email": [
    "email@gmail.com",
    "email@hotmail.com"
],
"website":
{
    "blog": "example.com"
},
"faculty":
{
    "department": [
    {
        "name": "department.name", 
        "location": "department.location"
    }
    ]
}
}


From the second JSON file, I'm not able to get name and location from the department. 从第二个JSON文件中,我无法从部门获得名称和位置。 How do I do that in C#? 如何在C#中做到这一点?

  • name : department.name 名称:部门名称
  • location: department.location 位置:department.location

Your problem is that department is an array of objects (though it happens to just contain one item here), but you're not accessing it like it is. 您的问题是, department是一个对象数组(尽管这里碰巧只包含一个项目),但是您却无法像这样访问它。 You can use o["faculty"]["department"][0]["name"] to get your data. 您可以使用o["faculty"]["department"][0]["name"]来获取数据。

You might want to use classes (here are ones auto-converted with http://json2csharp.com/ ) to more easily work with your data. 您可能希望使用类(这里是通过http://json2csharp.com/自动转换的类)来更轻松地处理数据。

public class Website
{
    public string blog { get; set; }
}

public class Department
{
    public string name { get; set; }
    public string location { get; set; }
}

public class Faculty
{
    public List<Department> department { get; set; }
}

public class RootObject
{
    public string name { get; set; }
    public List<string> email { get; set; }
    public Website website { get; set; }
    public Faculty faculty { get; set; }
}

Then you can get all of the data (instead of hoping the fixed indexes are right, and that you didn't make a typo in the property names) with this code: 然后,您可以使用以下代码获取所有数据(而不是希望固定索引正确,并且没有在属性名称中输入错误):

WebClient c = new WebClient();
var data = c.DownloadString("http://localhost/json1.json");
var o = JsonConvert.DeserializeObject<RootObject>(data);

listBox1.Items.Add(o.name);
foreach (var emailAddr in o.email)
    listBox1.Items.Add(emailAddr);
listBox1.Items.Add(o.website.blog);
foreach (var dept in o.faculty.department)
{
    listBox1.Items.Add(dept.name);
    listBox1.Items.Add(dept.location);
}
yourjsonobject.faculty.department[0].name;
yourjsonobject.faculty.department[0].location;

Here is some jsfiddle to help you with this: 这是一些jsfiddle可以帮助您解决这个问题:

http://jsfiddle.net/sCCrJ/ http://jsfiddle.net/sCCrJ/

 var r = JSON.parse('{"name": "Fname Lname","email": [    "email@gmail.com",       "email@hotmail.com"],"website":{    "blog": "example.com"},"faculty":{    "department": [    {        "name": "department.name",         "location": "department.location"    }    ]}}');
alert(r.faculty.department[0].name);
alert(r.faculty.department[0].location);

   for (var i = 0; i < r.faculty.department.length; i++) {
       alert(r.faculty.department[i].name);
   }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM