我有一个JSON,如下所示:
{
"options": [
{
"price": 217,
"quantity": 2
},
{
"price": 63,
"quantity": 5
}
]
}
字符串
我想用JsonPath查询它,得到“options”数组中每个元素的“price”和“quantity”的乘积。
我使用这个site来研究语法。我实际上找到了一种方法:
options[?(@.result = @.price * @.quantity)].result
型
此语法会将属性'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
型
你能帮我弄清楚吗?
**注意:**我只有UI可供我使用。不能访问代码,不能使用LINQ,也不能调用API。我只是碰巧知道底层实现。
2条答案
按热度按时间mmvthczy1#
JSONPath的语法在很长一段时间内都没有很好的标准化,所以一个实现和它所支持的内容可能与另一个实现有很大的不同(特别是你尝试过的在线工具-我发现它比我使用的JSONPath实现要宽松得多)例如this网站,我通常使用它作为语法的参考,它似乎缺少你尝试过的选项。不会按预期处理此查询表达式。
请注意,如
JToken.SelectToken
Method文档中所述:使用
JPath
表达式解析JToken
。解析与对象路径匹配的标记。因此,可以说它根本不应该支持这样的语法,并且根据Newtonsoft.Json github repo中的测试,这样的语法没有经过测试(至少在我浏览的测试中),可以安全地假设它不受支持。
因此,我建议只计算数组的元素并计算所需的值:
字符串
还要注意,有pending IETF specification,根据它,JSONPath是只查询的,不支持这样的语法。
tyg4sfes2#
JSON Path是一种仅用于查询的语法,它只能返回JSON文档中已经存在的值;不支持临时变量和其他类似的东西(尽管我喜欢这个想法)。
有一个待定的规范(正在等待IETF发布RFC编号):https://www.ietf.org/archive/id/draft-ietf-jsonpath-base-21.html。一旦它正式发布,我希望许多实现都会支持它。目前,在.NET中,只有我的 JsonPath.Net 实现了该规范。
在Github仓库中有很多问题,我们正在管理我们正在考虑的“v2”规范。我希望这个临时变量的分配/创建事情会是一个很好的,如果你想添加它。