使用Newtonsoft在C#中迭代嵌套的JSON数组

mka*_*tzm 5 c# json json.net

我有一块JSON如下:

[
  {
    "id": 1,
    "name": "Section1",
    "project_id": 100,
    "configs": [
      {
        "id": 1000,
        "name": "myItem1",
        "group_id": 1
      }
    ]
  },
  {
    "id": 2,
    "name": "Section2",
    "project_id": 100,
    "configs": [
      {
        "id": 1001,
        "name": "myItem2",
        "group_id": 2
      },
      {
        "id": 1002,
        "name": "myItem3",
        "group_id": 2
      },
      {
        "id": 1003,
        "name": "myItem4",
        "group_id": 2
      }
    ]
  },
  {
    "id": 3,
    "name": "Section3",
    "project_id": 100,
    "configs": [
      {
        "id": 1004,
        "name": "myItem5",
        "group_id": 5
      },
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我把它作为JArray把它拉进了Memory.

我需要遍历这一点,以便我只从配置子数组中获取id列表.理想情况下,我最终会得到这样的结论:

1000, myItem1
1001, myItem2
1002, myItem3
1003, myItem4
1004, myItem5
Run Code Online (Sandbox Code Playgroud)

我很难理解Newstonsoft称之为JObject与JArray的对象,或者如何访问每个数据结构的各个部分.我现在所拥有的如下:

foreach (JObject config in result["configs"])
{
    string id = (string)config["id"];
    string name = (string)config["name"];
    string gid = (string)config["group_id"];

    Console.WriteLine(name + " - " + id + " - " + gid);
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,但我希望它说明了我的最终目标.我一直无法拼凑如何实现这一目标.

Joh*_*ica 12

A JObject是一个对象(类似于一个类):

{
    "a": 1,
    "b": true
}
Run Code Online (Sandbox Code Playgroud)

A JArray是一个JSON数组,包含多个JObject实体:

[
    {
        "a": 1,
        "b": true
    },
    {
        "a": 2,
        "b": true
    }
]
Run Code Online (Sandbox Code Playgroud)

JSON文档的根可以是对象或数组.在你的情况下,它是一个数组.

下面的代码和提示显示您的代码很好,只要您将文档反序列化为数组即可.

string json = "[{\"id\":1,\"name\":\"Section1\",\"project_id\":100,\"configs\":[{\"id\":1000,\"name\":\"myItem1\",\"group_id\":1}]},{\"id\":2,\"name\":\"Section2\",\"project_id\":100,\"configs\":[{\"id\":1001,\"name\":\"myItem2\",\"group_id\":2},{\"id\":1002,\"name\":\"myItem3\",\"group_id\":2},{\"id\":1003,\"name\":\"myItem4\",\"group_id\":2}]},{\"id\":3,\"name\":\"Section3\",\"project_id\":100,\"configs\":[{\"id\":1004,\"name\":\"myItem5\",\"group_id\":5},]}]";
JArray obj = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(json);
foreach (var result in obj)
{
    foreach (JObject config in result["configs"])
    {
        string id = (string)config["id"];
        string name = (string)config["name"];
        string gid = (string)config["group_id"];

        Console.WriteLine(name + " - " + id + " - " + gid);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一个小的澄清:“JArray”可以包含“JObject”以外的东西。具体来说,如果 JSON 数组包含字符串或其他非对象值,则可能存在“JValue”。这就是为什么上面的“result”类型是更通用的“JToken”而不是“JObject” (2认同)