如何在JSONPath表达式中使用@ odata.count属性?

时间:2019-03-29 19:24:35

标签: json odata soapui jsonpath

从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 Testsuite断言中使用该表达式。

将响应中的“ @ 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

1 个答案:

答案 0 :(得分:0)

好的,以下对我有用:

$..[?(@.['@odata.count'] > 1)]

它为我提供了与表达式$..相同的数组(包含json响应的数组)。 根据我自己的发现,它会做什么:

$..[]-查看包含响应的数组

?(@.['@odata.count'] > 1)-选择包含值大于1的属性的数组项

如果我错了,请纠正我。 我只是不明白第三个点,八个字符的区别。我认为在使用括号表示法时不需要它,由于属性的名称,此处需要使用括号表示法。

着眼于在SoapUI的测试套件声明中使用它的最终目标,从长远来看,以下内容可能更具可读性和可定制性(应该在4个小时前与groovy一起研究此解决方案)。 ..):

import groovy.json.JsonSlurper
jsonResponse = new JsonSlurper().parseText(context.response)
odatacount = "${jsonResponse.'@odata.count'}"
assert odatacount > 1