JsonPath:如果满足条件,则选择根级别字段

时间:2014-07-30 07:36:20

标签: json filter jsonpath input-filtering

鉴于以下 Json 输入:

{ 
  "category": "fiction",
  "author": "Evelyn Waugh",
  "title": "Sword of Honour",
  "price": 12.99
}

如果作者匹配例如给定名称,我需要选择作者字段。 Evelyn Waugh。我正在努力为此编写JsonPath表达式。我尝试了以下但没有成功。有谁能提出正确的表达方式?

$.author?(@ == 'Evelyn Waugh')
$.?(@.author == 'Evelyn Waugh')
$..?(@.author == 'Evelyn Waugh')

3 个答案:

答案 0 :(得分:2)

尝试$。[?($。author =='Evelyn Waugh')]

答案 1 :(得分:1)

对我来说@Bernie 的回答似乎有效:

$[?($.author == 'Evelyn Waugh')]

它适用于 3/4 json path executors(不幸的是,一个不起作用的是 jsonpath.com)。

工作的是:

  1. https://codebeautify.org/jsonpath-tester
  2. https://jsonpath.herokuapp.com/
  3. WireMock(在 Java 中使用 jsonpath)

对于那些想知道为什么使用它以及为什么不在这里进行简单比较的人,请继续阅读。

在我的例子中,我使用 wiremock 来模拟基于 json 的不同输入值的不同服务器响应,例如当 "author""Evelyn Waugh" 然后用 {"books":"10"} 回复,对于 "author" 的所有其他值,回复可能是 {"books":"20"}

所以这里的选项只是与 json 路径匹配,这就是诀窍。

对于那些仍然想知道的人请注意,wiremock 以某种方式不适用于 ifelse 条件,如果您依赖于 else 条件(通配符匹配),它位于所有条件。

答案 2 :(得分:0)

我想你可以这样做:

$[?($.author === @ && @ == 'Evelyn Waugh')]

但如果您问我,这是一个非常无用的查询并且容易出错。如果有另一个具有作者姓名的财产,这一切都会下地狱。

坦率地说,你应该找到作者并测试它是否是你期待的名字。不要试图强迫它发挥作用,它并不意味着以这种方式使用。