如何在JSONPath表达式中使用@odata.count 属性?
How to use @odata.count property in JSONPath expression?
使用来自 OData v4 API 响应的以下 JSON 对象:
{
"@odata.context": "https://api.asdfasdf.com/",
"@odata.count": 2,
"value": [
{
"id": 123456789,
"name": "Random name"
},
{
"id": 15345,
"name": "Random name2"
}
]
}
这适用于 select 数组中的对象:
$.value[?(@.id == 123456789)]
通过这个 JSONPath,我可以获得 属性“@odata.count”的值:
$.['@odata.count']
但是如何使用“@odata.count”来写JSON带有表达式的路径呢?
例如。 select仅当计数大于 1 时,这些表达式失败:
$.[('@odata.count' > 1)]
$.[?('@odata.count' > 1)]
$.[(@.['@odata.count'] > 1)]
... and a lot of other expressions
我坚信我正在研究 json 与我想象的不同的深度,
属性 的命名约定(以及 select 的命名方式)让我抓狂。
最终目标是在 SoapUI 测试套件断言中使用表达式。
将响应中的“@odata.count”属性 与我们的测试数据进行比较。
编辑:
感谢评论者,通过删除数字后的引号修复了 json。
以及帮助我找到解决方案的表达式的其他发现:
这些表达式导致“2”:
$['@odata.count']
$..[0]['@odata.count']
这个表达式产生一个空数组:
$..[?(@['@odata.count'] > 1)]
这个表达式产生值 'null':
?($['@odata.count'] > 1)
编辑 2:
我认为这个问题应该问得更笼统一些,更多的是关于 "how to use root properties/root attributes/direct children of the response in JSONPath"。
我发现了一个类似的问题,但答案完全不同:Querying direct children of root element with jsonpath
好的,以下对我有用:
$..[?(@.['@odata.count'] > 1)]
它给了我与表达式 $..
相同的数组(一个包含 json 响应的数组)。
根据我自己的发现,它的作用是:
$..[]
- 查看包含响应的数组
?(@.['@odata.count'] > 1)
- 选择包含 属性 且值大于 1
的数组项
如有错误请指正。
我只是不明白第三个点,即八个字符的区别。我认为在使用括号表示法时不需要它,因为属性的名称这里需要它。
看看在 SoapUI 中的测试套件的断言中使用它的最终目标,以下内容可能在长 运行 中更具可读性和可定制性(应该用 [=15 研究这个解决方案=] 4 小时前...):
import groovy.json.JsonSlurper
jsonResponse = new JsonSlurper().parseText(context.response)
odatacount = "${jsonResponse.'@odata.count'}"
assert odatacount > 1
使用来自 OData v4 API 响应的以下 JSON 对象:
{
"@odata.context": "https://api.asdfasdf.com/",
"@odata.count": 2,
"value": [
{
"id": 123456789,
"name": "Random name"
},
{
"id": 15345,
"name": "Random name2"
}
]
}
这适用于 select 数组中的对象:
$.value[?(@.id == 123456789)]
通过这个 JSONPath,我可以获得 属性“@odata.count”的值:
$.['@odata.count']
但是如何使用“@odata.count”来写JSON带有表达式的路径呢? 例如。 select仅当计数大于 1 时,这些表达式失败:
$.[('@odata.count' > 1)]
$.[?('@odata.count' > 1)]
$.[(@.['@odata.count'] > 1)]
... and a lot of other expressions
我坚信我正在研究 json 与我想象的不同的深度, 属性 的命名约定(以及 select 的命名方式)让我抓狂。
最终目标是在 SoapUI 测试套件断言中使用表达式。
将响应中的“@odata.count”属性 与我们的测试数据进行比较。
编辑: 感谢评论者,通过删除数字后的引号修复了 json。
以及帮助我找到解决方案的表达式的其他发现:
这些表达式导致“2”:
$['@odata.count']
$..[0]['@odata.count']
这个表达式产生一个空数组:
$..[?(@['@odata.count'] > 1)]
这个表达式产生值 'null':
?($['@odata.count'] > 1)
编辑 2: 我认为这个问题应该问得更笼统一些,更多的是关于 "how to use root properties/root attributes/direct children of the response in JSONPath"。 我发现了一个类似的问题,但答案完全不同:Querying direct children of root element with jsonpath
好的,以下对我有用:
$..[?(@.['@odata.count'] > 1)]
它给了我与表达式 $..
相同的数组(一个包含 json 响应的数组)。
根据我自己的发现,它的作用是:
$..[]
- 查看包含响应的数组
?(@.['@odata.count'] > 1)
- 选择包含 属性 且值大于 1
如有错误请指正。 我只是不明白第三个点,即八个字符的区别。我认为在使用括号表示法时不需要它,因为属性的名称这里需要它。
看看在 SoapUI 中的测试套件的断言中使用它的最终目标,以下内容可能在长 运行 中更具可读性和可定制性(应该用 [=15 研究这个解决方案=] 4 小时前...):
import groovy.json.JsonSlurper
jsonResponse = new JsonSlurper().parseText(context.response)
odatacount = "${jsonResponse.'@odata.count'}"
assert odatacount > 1