Jsonpath为数组的长度

时间:2014-07-16 08:24:37

标签: arrays groovy size spock jsonpath

鉴于json如

{"arr1" : [1,2,3], "arr2" : []}

在那里知道有名为arr1和arr2的数组,是否有一个数组的 length 的jsonpath表达式,它将适用于空数组和非空数组?

我使用谷歌代码的JsonPath库进行了多次尝试,注意:

JsonPath.read(json, "arr1.length")

但是它给出了一个错误,说数组没有属性。

我正在寻找一个解析为数组长度的单个字符串路径,而不是后续调用中间数,例如

JsonPath.read(json, "arr1").length // useless to me

表达的任何复杂程度都是可以接受的。

对于上下文,我想提供一个带路径/值对的测试套装,这对于值很有用,但我不能用这种模式断言数组 size

2 个答案:

答案 0 :(得分:8)

如果仅在断言时需要数组的长度,那么json-path-assert工件可以与JsonPath一起使用。这是一个用Groovy编写的示例:

@Grab('com.jayway.jsonpath:json-path:0.9.1')
@Grab('com.jayway.jsonpath:json-path-assert:0.9.1')

import com.jayway.jsonpath.JsonPath
import static com.jayway.jsonassert.JsonAssert.*
import static org.hamcrest.MatcherAssert.assertThat
import static org.hamcrest.Matchers.*

def json = /{ "arr1": [1,2,3], "arr2": [] }/

with(json).assertThat( "arr1", hasSize(3) )
          .assertThat( "arr2", hasSize(0) )
          .assertThat( "arr2", emptyCollection() )

验证断言是否因不同大小的数组而失败。最好的部分是使用Hamcrest's Matcher API,这为灵活多变的断言打开了大门。

无法从路径表达式AFAIK获得长度。

答案 1 :(得分:1)

@dmahapatro正确地说明了

  

无法从路径表达式中获取长度

如果您只需要它来访问某些特定元素(让我们说一下数组的最后一个元素),您仍然可以使用:

{"arr1": [1,2,3], "arr2": [{"name": "a"}, {"name": "b"}]}
arr1[(@.length-1)]       // returns "3"
arr2[(@.length-1)].name  // returns "b"

您还可以执行更多高级请求,但为此我建议您查看插件documentation