使用JPath,如何根据同一节点的另一个键值对返回值?

时间:2016-10-22 03:14:29

标签: json json.net

我有以下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”,我需要做什么?

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