JsonPath:如果满足条件,则选择根级别字段
Posted
技术标签:
【中文标题】JsonPath:如果满足条件,则选择根级别字段【英文标题】:JsonPath: Selecting root level field if satisfies a condition 【发布时间】:2014-09-21 18:17:42 【问题描述】:鉴于以下 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')
【问题讨论】:
我认为您完全误解了 jsonpath 的用途。它不适合用于那个。 【参考方案1】:试试 $.[?($.author=='Evelyn Waugh')]
【讨论】:
我认为这行不通,至少通过 jsonpath.com【参考方案2】:我想你可以这样做:
$[?($.author === @ && @ == 'Evelyn Waugh')]
但如果你问我,那是一个非常无用的查询并且容易出错。如果有另一个带有作者姓名的财产,那一切都将一去不复返了。
坦率地说,您应该找到作者并测试它是否是您所期望的名称。不要试图强迫它工作,它不应该以这种方式使用。
【讨论】:
为什么不应该使用 json 路径对根对象进行测试?【参考方案3】:对我来说@Bernie 的回答似乎有效:
$[?($.author == 'Evelyn Waugh')]
它适用于 3/4 json 路径执行器(不幸的是,不工作的是 jsonpath.com)。
工作的是:
-
https://codebeautify.org/jsonpath-tester
https://jsonpath.herokuapp.com/
WireMock(在 java 中使用 jsonpath)
对于那些想知道为什么使用它以及为什么不在这里进行简单比较的人,请继续阅读。
在我的情况下,我使用wiremock根据json的不同输入值模拟不同的服务器响应,例如当“author”是“Evelyn Waugh”时回复 "books":"10" 并为 "author" 的所有其他值回复,也许是 "books":"20"
所以这里的选项只是匹配一个 json 路径,这就是诀窍。
对于那些仍然想知道的人,请注意,wiremock 不能在 if 和 else 条件下工作,如果您依赖 else 条件(通配符匹配),它会在所有条件。
【讨论】:
以上是关于JsonPath:如果满足条件,则选择根级别字段的主要内容,如果未能解决你的问题,请参考以下文章