[英]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.