Newtonsoft.Json 的 JsonPath 实现中的赋值

问题描述 投票:0回答:1

我有一个像这样的Json:

{
    "options": [
        {
            "price": 217,
            "quantity": 2
        },
        {
            "price": 63,
            "quantity": 5
        }
    ]
}

我想用 JsonPath 查询它,以获得“选项”数组中每个元素的“价格”和“数量”的乘积。

我使用这个site来尝试语法。我实际上找到了一种方法:

options[?(@.result = @.price * @.quantity)].result

此语法向每个元素添加一个属性“结果”,并将产品存储在其中,如下所示:

[
  {
    "price": 217,
    "quantity": 2,
    "result": 434  // yay!
  },
  {
    "price": 63,
    "quantity": 5,
    "result": 315  // yay!
  }
]

所以最终的结果正是我想要的:

[
  434,
  315
]

我真的不需要设置任何属性。我只是想要这样的结果。

问题是 - 它在我的 C# 应用程序(使用 Newtonsoft.Json)中不起作用。它无法解析查询。 我尝试事先用 Json 引入属性,也没成功。

json = JObject.Parse(@"{}"); // same Json as above

var result = json.SelectTokens("options[?(@.result = @.price * @.quantity)].result"); // exception

你能帮我解决一下吗?

c# json.net jsonpath
1个回答
0
投票

首先 JSONPath 语法没有那么好标准化。例如,我通常用作语法参考的this网站似乎不提供您使用的选项。并且这个在线验证器不处理这个查询表达式。因此,一种实现及其支持的内容可能与另一种实现有很大不同。

请注意,如

JToken.SelectToken
方法文档中所述:

使用

JToken
表达式选择
JPath
。选择与对象路径匹配的标记。

所以可以说它根本不应该支持这种语法。

所以我建议只迭代数组的元素并计算所需的值:

var results = new List<int>();
foreach (var elem in json["options"])
{
    results.Add(elem["price"].Value<int>() * elem["quantity"].Value<int>());
}
© www.soinside.com 2019 - 2024. All rights reserved.