1

我有一个 JSON 字符串,如下所示:

json =  "{\"Things\": \n" +
    "    {\"Thing\": {\n" +
    "        \"ID\":\"123\",\n" +
    "        \"name\":\"Yet Another Thing\",\n" +
    "        \"price\":\"$12.99\",\n" }\n" +
    "    }\n" +
    "}";

有没有办法在同一个语句/断言中断言IDofThing123 ANDname是“ Yet Another Thing” ?

目前,我似乎无法使用过滤器:

JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")

我得到以下异常:

java.lang.IllegalArgumentException:无效的容器对象

这可能是因为[]上面的 JSON 字符串中没有数组表示法吗?应该有吗?

在相关说明中,是否有关于使用 Hamcrest(带有 JSON 断言)的很好的介绍?我知道官方教程,但我似乎总是弄错......

更新:这样做的理由是:如果我得到几个Thing元素,我不能保证他们的顺序(所以我不能匹配Thing[1](除非我循环遍历它们))?如何确保一个元素同时具有正确的 ID 和正确的名称?如果我单独检查孩子,我会不会冒一个人Thing有正确的名字,另一个人有正确的 ID,但没有一个人同时拥有这两者的风险?(这种 JSON 格式是否可行,或者在这种情况下我是否必须使用数组,例如"Thing": [ { ... }, { ... } ], ...

PS:我最后尝试使用上面的 JsonPath 如下:assertEquals("Yet Another Thing", JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")); 所以这也是异常可能来自的地方。另外,我最初在 JsonPath 邮件列表上问过这个问题,但到目前为止没有得到任何回复,所以希望我能更快地在这里得到帮助...... :)

4

1 回答 1

1

The tutorial gives the solution to your problem, it seems:

JsonAssert.with(json).assertThat("$.Things.Thing.ID", Matchers.equalTo("123"))
    .assertThat("$.Things.Thing.name", Matchers.equalTo("Yet Another Thing"));
于 2014-03-10T16:51:13.987 回答