【发布时间】:2019-03-29 19:24:35
【问题描述】:
使用来自 OData v4 API 响应的以下 JSON 对象:
{
"@odata.context": "https://api.asdfasdf.com/",
"@odata.count": 2,
"value": [
{
"id": 123456789,
"name": "Random name"
},
{
"id": 15345,
"name": "Random name2"
}
]
}
这适用于选择数组中的对象:
$.value[?(@.id == 123456789)]
通过这个 JSONPath,我可以获得属性“@odata.count”的值:
$.['@odata.count']
但是如何使用“@odata.count”编写带有表达式的 JSONPath? 例如。仅当计数大于 1 时才选择,这些表达式失败:
$.[('@odata.count' > 1)]
$.[?('@odata.count' > 1)]
$.[(@.['@odata.count'] > 1)]
... and a lot of other expressions
我坚信我正在研究的 json 深度与我想象的不同, 属性的命名约定(以及选择它的方式)让我抓狂。
最终目标是在 SoapUI 测试套件断言中使用表达式。
将响应中的“@odata.count”属性与我们的测试数据进行比较。
编辑: 感谢评论者,通过删除数字后的引号来修复 json。
以及帮助我找到解决方案的其他表达式发现:
这些表达式的结果是“2”:
$['@odata.count']
$..[0]['@odata.count']
这个表达式产生一个空数组:
$..[?(@['@odata.count'] > 1)]
这个表达式的结果是'null':
?($['@odata.count'] > 1)
编辑 2: 我认为这个问题应该被问得更笼统一些,它更多的是关于“如何在 JSONPath 中使用响应的根属性/根属性/直接子级”。 我发现了一个类似的问题,但答案完全不同:Querying direct children of root element with jsonpath
【问题讨论】:
-
无效的 JSON。我认为你的“id”行:15345”,应该是“id”:15345,
-
你在用java吗?
-
我最后回答了自己,但不能投票。我在 SoapUI 中的 JSONPath 表达式中使用这些表达式。 SoapUI 使用Groovy,但我不确定它是否也用于解析测试套件中断言中提供的 JSONPath 表达式。
标签: json odata soapui jsonpath