遍历JObject嵌套数组

时间:2020-01-22 19:36:37

标签: c# json json.net

我无法确切地知道如何通过此JObject来获取运行时的id属性。

我有以下代码,可以成功为我提供条目下的id属性,但是如何再次嵌套它以进入运行部分并获得这些ID?

JSON:

{
  "id": 168,
  "name": "section 1",
  "entries": [
    {
      "id": "908-9876-908",
      "suite_id": 15,
      "name": "List 1",
      "runs": [
        {
          "id": 169,
          "suite_id": 15
        }
      ]
    },
    {
      "id": "998-4344-439",
      "suite_id": 16,
      "name": "List 2",
      "runs": [
        {
          "id": 170,
          "suite_id": 16
        }
      ]
    }
  ]
}

C#代码:

JObject obj = JsonConvert.DeserializeObject<JObject>(response);

foreach (JObject id in obj["entries"])
{
    string returnable = (string)id["id"];
    Console.WriteLine(returnable);
}

我尝试查看[“ entries”] [“ runs”],但那也没有用。

打印出来的是:

908-9876-908
998-4344-439

我想要的是

169
170

2 个答案:

答案 0 :(得分:4)

您可以使用以下代码实现

var jsonObject = JObject.Parse(json);

foreach (var entry in jsonObject["entries"])
{
    foreach (var run in entry["runs"])
    {
        string returnable = (string)run["id"];
        Console.WriteLine(returnable);
    }               
}

您想看

169
170

它们是id数组中的runs个值,因此您应该在内部循环中枚举它们。您还错过了"name": "section 1"

之后的逗号

答案 1 :(得分:1)

您可以使用SelectTokens()JToken层次结构中查询嵌套数据。它支持JSONPath查询,包括数组的通配符[*]

var ids = obj.SelectTokens("entries[*].runs[*].id").Select(i => (long)i).ToList();  

请参阅:Querying JSON with complex JSON Path

演示小提琴here