我有以下JSON文件。为了简化这个问题,它被截断了。实际的JSON文件将包含10 - 20条消息和3 - 15条结果。
{
"messages": [
{
"type": "msgInfo",
"description": "Some stuff happened"
},
{
"type": "msgInfo",
"description": "More stuff happened"
},
{
"type": "msgInfo",
"description": "yup, more stuff happened"
}
],
"results": [
{
"parameterId": "val_1",
"dataType": "Double",
"value": 123.45
},
{
"parameterId": "val_2",
"dataType": "Double",
"value": 246.80
},
{
"parameterId": "val_3",
"dataType": "Double",
"value": 135.79
},
{
"parameterId": "val_4",
"dataType": "Long",
"value": 20161021
}
]
}
我正在尝试根据value
键的值检索parameterId
键的值。例如,我需要使用JPath将“123.45”返回到“val_1”。
到目前为止,我有这段代码(从this帖子中复制),但我无法正确使用该路径。
JObject obj = JObject.Parse(json);
JToken token = obj["results"]["parameterId"];
Console.WriteLine(token.Path + " -> " + token.ToString());
Console.ReadLine();
为了使用JPath返回“123.45”到“val_1”,我需要做什么?
答案 0 :(得分:0)
要根据value
令牌的值从results
数组中的某个结果中获取parameterId
令牌,您需要使用SelectToken
方法JSONPath查询表达式:
JToken token = obj.SelectToken("$.results[?(@.parameterId=='val_1')].value");
JSONPath语法有时可能有点棘手,具体取决于您要执行的操作,因此您可能会发现this one等在线表达式评估程序有助于进行实验。
或者,您可以使用LINQ查询执行相同的操作:
JToken token = obj["results"]
.Where(result => (string)result["parameterId"] == "val_1")
.Select(result => result["value"])
.FirstOrDefault();
这是一个显示两种方法的小提琴:https://dotnetfiddle.net/8qiSCa