我有一个像这样的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
你能帮我解决一下吗?
首先 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>());
}