Newtonsoft.Json的JsonPath实现中的赋值

vyswwuz2  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(60)

我有一个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。我只是碰巧知道底层实现。

mmvthczy

mmvthczy1#

JSONPath的语法在很长一段时间内都没有很好的标准化,所以一个实现和它所支持的内容可能与另一个实现有很大的不同(特别是你尝试过的在线工具-我发现它比我使用的JSONPath实现要宽松得多)例如this网站,我通常使用它作为语法的参考,它似乎缺少你尝试过的选项。不会按预期处理此查询表达式。
请注意,如JToken.SelectToken Method文档中所述:
使用JPath表达式解析JToken。解析与对象路径匹配的标记。
因此,可以说它根本不应该支持这样的语法,并且根据Newtonsoft.Json github repo中的测试,这样的语法没有经过测试(至少在我浏览的测试中),可以安全地假设它不受支持。
因此,我建议只计算数组的元素并计算所需的值:

var results = new List<int>();
foreach (var elem in json["options"])
{
    results.Add(elem["price"].Value<int>() * elem["quantity"].Value<int>());
}

字符串
还要注意,有pending IETF specification,根据它,JSONPath是只查询的,不支持这样的语法。

tyg4sfes

tyg4sfes2#

JSON Path是一种仅用于查询的语法,它只能返回JSON文档中已经存在的值;不支持临时变量和其他类似的东西(尽管我喜欢这个想法)。
有一个待定的规范(正在等待IETF发布RFC编号):https://www.ietf.org/archive/id/draft-ietf-jsonpath-base-21.html。一旦它正式发布,我希望许多实现都会支持它。目前,在.NET中,只有我的 JsonPath.Net 实现了该规范。
在Github仓库中有很多问题,我们正在管理我们正在考虑的“v2”规范。我希望这个临时变量的分配/创建事情会是一个很好的,如果你想添加它。

相关问题