我有一个JSON字符串,如下所示:
json = "{\"Things\": \n" +
" {\"Thing\": {\n" +
" \"ID\":\"123\",\n" +
" \"name\":\"Yet Another Thing\",\n" +
" \"price\":\"$12.99\",\n" }\n" +
" }\n" +
"}";
有没有办法可以断言ID
Thing
为123
AND ,name
为Yet Another Thing
为JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")
“相同的语句/断言?
目前,我似乎无法使用过滤器:
[]
我得到以下异常:
java.lang.IllegalArgumentException:无效的容器对象
这可能是因为上面的JSON字符串中没有数组符号Thing
吗?应该有吗?
在相关的说明中,是否有使用Hamcrest(使用JSON断言)的良好介绍?我知道官方教程,但我似乎总是弄错了......
更新:这个的理由是:如果我得到几个Thing[1]
元素怎么办?关于我的命令我不能保证(所以我不能匹配Thing
(除非我循环通过它们全部))?如何确保一个元素具有正确的ID和正确的名称?如果我单独检查孩子,不要冒一个"Thing": [ { ... }, { ... } ], ...
有正确名字而另一个有正确ID的风险,但没有一个都有吗? (这种JSON格式是可能的,或者在这种情况下我是否需要一个数组,如assertEquals("Yet Another Thing", JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name"));
?
P.S。:我最后尝试使用上面的JsonPath如下:{{1}} 这也是异常可能来自的地方。另外,我最初在JsonPath邮件列表上问了这个问题,但到目前为止还没有得到任何回复,所以希望我能在这里得到更快的帮助...... :)
答案 0 :(得分:1)
教程为您的问题提供了解决方案,似乎:
JsonAssert.with(json).assertThat("$.Things.Thing.ID", Matchers.equalTo("123"))
.assertThat("$.Things.Thing.name", Matchers.equalTo("Yet Another Thing"));