簡體   English   中英

遍歷嵌套的JSON對象數組並訪問內部令牌值

[英]Iterate through nested JSON object array and access inner token value

我有一些下面的JSON對象從json文件加載。

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

      ]
    }
  ]
}

我想從中獲得代幣“城市”的價值

 "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"));

問題:如何獲得令牌的“城市”值?

您可以查詢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);
}

輸出:

在此處輸入圖片說明

在線演示

您可以使用以下代碼獲得獨特的價值

result = result.Distinct();

進一步閱讀:

關於訪問城市價值的確切的問題,你必須改變你的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM