Json.Net 从 JObject 循环更改为 JArray
Json.Net Changing from JObject loops to JArray
我正在提取一个看起来像这样的 JSON 提要。
{
"bank": [
{
"id": 35,
"name": "bank 1",
"endpoints": [
{
"epId": 407,
"epName": "FRED001"
},
{
"epId": 516,
"epName": "FRED002"
},
{
"epId": 625,
"epName": "FRED003"
}
]
},
{
"id": 32,
"name": "bank 2",
"endpoints": [
{
"epId": 426,
"epName": "HENRY001"
},
{
"epId": 553,
"epName": "HENRY002"
}
]
},
{
"id": 20,
"name": "bank 3",
"endpoints": [
{
"epId": 1802,
"epName": "GEORGE001"
},
{
"epId": 920,
"epName": "GEORGE002"
},
{
"epId": 1052,
"epName": "GEORGE003"
}
]
}
]
}
最终目标是使用已知的 epName 'FRED001' 进行搜索,并检索到相应的 epId '407,输出到 MessageBox。
我可以在 C# 中使用循环来做到这一点,例如:
JObject jResults = JObject.Parse(jsonfeed);
JToken jResults_bank = jResults["bank"];
foreach (JObject bank in Results_bank)
{
JToken jResults_bank_endpoint = bank["endpoints"];
foreach (JObject endpoint in jResults_bank_endpoint)
{
if (bank["epName"].ToString() == "FRED001")
{
MessageBow.Show(bank["epId"].ToString());
}
}
}
然而,这似乎不是最好的方法,我相信我应该通过构建数组在 C# 中执行此操作。如何使用 JArray
获得相同的结果?
无需显式循环 或 更改解析方式 - 您只需将 LINQ 与 JSON:
一起使用
using System;
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;
class Test
{
static void Main(string[] args)
{
string text = File.ReadAllText("Test.json");
JObject json = JObject.Parse(text);
var ids = from bank in json["bank"]
from endpoint in bank["endpoints"]
where (string) endpoint["epName"] == "FRED001"
select (string) endpoint["epId"];
foreach (var id in ids)
{
Console.WriteLine(id);
}
}
}
或者简单的方法就是像这样循环遍历它。
JObject json = JObject.Parse(text);
foreach (var id in json["bank"])
{
// your condition here
if(id["epName"]=="FRED001")
Console.WriteLine(id);
}
JObject JObj = (JObject)yourjsontext;
JArray JArr = (JArray)JObj["bank"];
for (int i = 0; i < JArr.Count; i++)
{
Console.WriteLine(JArr[i]["id"].ToString());
Console.WriteLine(JArr[i]["name"].ToString());
foreach (var endpoints in JArr[i]["endpoints"])
{
Console.WriteLine(endpoints["epId"].ToString());
Console.WriteLine(endpoints["epName"].ToString());
}
}
我正在提取一个看起来像这样的 JSON 提要。
{
"bank": [
{
"id": 35,
"name": "bank 1",
"endpoints": [
{
"epId": 407,
"epName": "FRED001"
},
{
"epId": 516,
"epName": "FRED002"
},
{
"epId": 625,
"epName": "FRED003"
}
]
},
{
"id": 32,
"name": "bank 2",
"endpoints": [
{
"epId": 426,
"epName": "HENRY001"
},
{
"epId": 553,
"epName": "HENRY002"
}
]
},
{
"id": 20,
"name": "bank 3",
"endpoints": [
{
"epId": 1802,
"epName": "GEORGE001"
},
{
"epId": 920,
"epName": "GEORGE002"
},
{
"epId": 1052,
"epName": "GEORGE003"
}
]
}
]
}
最终目标是使用已知的 epName 'FRED001' 进行搜索,并检索到相应的 epId '407,输出到 MessageBox。
我可以在 C# 中使用循环来做到这一点,例如:
JObject jResults = JObject.Parse(jsonfeed);
JToken jResults_bank = jResults["bank"];
foreach (JObject bank in Results_bank)
{
JToken jResults_bank_endpoint = bank["endpoints"];
foreach (JObject endpoint in jResults_bank_endpoint)
{
if (bank["epName"].ToString() == "FRED001")
{
MessageBow.Show(bank["epId"].ToString());
}
}
}
然而,这似乎不是最好的方法,我相信我应该通过构建数组在 C# 中执行此操作。如何使用 JArray
获得相同的结果?
无需显式循环 或 更改解析方式 - 您只需将 LINQ 与 JSON:
一起使用using System;
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;
class Test
{
static void Main(string[] args)
{
string text = File.ReadAllText("Test.json");
JObject json = JObject.Parse(text);
var ids = from bank in json["bank"]
from endpoint in bank["endpoints"]
where (string) endpoint["epName"] == "FRED001"
select (string) endpoint["epId"];
foreach (var id in ids)
{
Console.WriteLine(id);
}
}
}
或者简单的方法就是像这样循环遍历它。
JObject json = JObject.Parse(text);
foreach (var id in json["bank"])
{
// your condition here
if(id["epName"]=="FRED001")
Console.WriteLine(id);
}
JObject JObj = (JObject)yourjsontext;
JArray JArr = (JArray)JObj["bank"];
for (int i = 0; i < JArr.Count; i++)
{
Console.WriteLine(JArr[i]["id"].ToString());
Console.WriteLine(JArr[i]["name"].ToString());
foreach (var endpoints in JArr[i]["endpoints"])
{
Console.WriteLine(endpoints["epId"].ToString());
Console.WriteLine(endpoints["epName"].ToString());
}
}