遍历嵌套的JSON对象数组并访问内部令牌值

时间:2019-08-26 11:53:41

标签: c# json json.net

我从json文件中加载了一些下面的JSON对象。

{
  "Context": [   
    {   
      "name": "Cities",
      "cities": [ "hyd", "bang", "chennai" ],
      "location": [
        {
          "city": [ "hyd" ],
          "address": "xxx"
        },
        {
          "city": [ "hyd", "bang" ],
          "address": "xxx"
        },

      ]
    }
  ]
}

我想从

获取令牌“ city”的值
 "location": [
        {
          "city": [ "hyd" ],
          "address": "xxx"
        },
        {
          "city": [ "hyd", "bang" ],
          "address": "xxx"
        }
      ]

使用下面的代码,我可以获得令牌“名称”的值。

StreamReader rs = new StreamReader("Jsonfilepath\.json");

 string json = rs.ReadToEnd();
 var jsonObject = JObject.Parse(json).Children();

  List<JToken> tokens = jsonObject.Children().Children().ToList();

 var value = tokens.Any(each    =>each["name"].ToString().ToLower().Contains("cities"));

问题:如何获取令牌“城市”值?

2 个答案:

答案 0 :(得分:2)

您可以查询json以获取所需的结果

JToken jToken = JToken.Parse(json);

var result = jToken["Context"].SelectMany(x => x["location"].SelectMany(y => y["city"].Select(z => z)).ToList());

foreach (var item in result)
{
    Console.WriteLine(item);
}

输出:

enter image description here

Online Demo

通过使用以下代码,您可以获得独特的价值

result = result.Distinct();

进一步阅读:

答案 1 :(得分:0)

关于获取城市价值的确切问题,您必须将any更改为FirstOrDefault

 var value = tokens.FirstOrDefault(each=>each["name"].ToString().ToLower().Contains("cities"));
 if (value != null)
     var city = value["city"];

这将为您提供json节点,而不是告诉您是否存在(如果不存在,则为null)。

您可以使用SelectToken简化所有操作:

var cities = jsonObject.SelectToken("$.Context[?(@.name == 'Cities')].location.city");

我没有尝试最后一次查询,但这向您提示了如何尝试改善json管理。

更多文档在这里:Newtonsoft.Json