使用C#读取json值,而不使用Property



我需要从下面的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);
}
}

最新更新