我需要从下面的JSON响应字符串中读取id 100000的testCase.name的值。
response = {
"count": 2,
"value": [
{
"id": 100000,
"project": {
"id": "aaaa-bbbb-cccc-dddd",
"name": "MyTestProject",
"url": "https://dev.azure.com/MyOrg/_apis/projects/MyTestProject"
},
"testCase": { "name": "GetProjectTeamDetails" }
},
{
"id": 100001,
"project": {
"id": "aaaa-bbbb-cccc-dddd",
"name": "MyTestProject",
"url": "https://dev.azure.com/MyOrg/_apis/projects/MyTestProject"
},
"testCase": { "name": "QueueBuild" }
}
]
}
我尝试过以下代码,但无法实现:Try1:
JObject o = JObject.Parse(response)
string testCaseName= (string)o["values"][0];
Try2:
JObject jObject = JObject.Parse(response);
string displayName = (string)jObject.SelectToken("testCase.name");
您可以使用
var jo = JObject.Parse(json);
var testCaseName = (string)jo.SelectToken($"$.value[?(@id=={idToSearch})].testCase.name");
更新
根据你在评论中的问题,你可以使用找到带有测试用例名称的ID
jo.SelectTokens($"$.value[?(@testCase.name=='{nameToSearch}')].id")
请注意,在这种情况下,您需要使用.SelectTokens
,因为正如OP中的示例所示,有可能出现重复。您可以根据您的要求获得所有结果或第一个结果。
var idList = jo.SelectTokens($"$.value[?(@testCase.name=='{nameToSearch}')].id")
.Select(x=> long.Parse(x.ToString()));
var onlyFirst = (long)jo.SelectTokens($"$.value[?(@testCase.name=='{nameToSearch}')].id")
.First();
您需要遍历层次结构。
JObject jObject = JObject.Parse(jsonString);
var testCaseName = jObject.SelectToken("value[0].testCase.name").ToString();
另一种方法是使用dynamic
关键字:
dynamic jt = JToken.Parse(response);
IEnumerable<dynamic> values = jt.value;
string name = values.FirstOrDefault(v => v.id == 100000)?.testCase.name;
使用SelectToken
显示了其他答案,这很好——如果你不想这样做,你仍然可以通过一次访问一个属性来完成:
using System;
using System.IO;
using Newtonsoft.Json.Linq;
class Test
{
static void Main()
{
string json = File.ReadAllText("test.json");
JObject obj = JObject.Parse(json);
string testCase = (string) obj["value"][0]["testCase"]["name"];
Console.WriteLine(testCase);
}
}
在Try1中,您使用的是values
而不是value
,并且您在数组处停止—您没有要求其中的testCase
属性或name
属性。
在Try2中,您所做的恰恰相反——您正在查找testCase.name
,而不首先在value
数组中选择元素。
作为第三种方式,您可以使用动态键入:
using System;
using System.IO;
using Newtonsoft.Json.Linq;
class Test
{
static void Main()
{
string json = File.ReadAllText("test.json");
dynamic obj = JObject.Parse(json);
string testCase = obj.value[0].testCase.name;
Console.WriteLine(testCase);
}
}