如何断言JSON节点是否具有分配给它们的特定值的子节点?

时间:2014-03-10 16:37:26

标签: java json jsonpath

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

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

有没有办法可以断言ID Thing123 AND nameYet Another ThingJsonPath.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邮件列表上问了这个问题,但到目前为止还没有得到任何回复,所以希望我能在这里得到更快的帮助...... :)

1 个答案:

答案 0 :(得分:1)

教程为您的问题提供了解决方案,似乎:

JsonAssert.with(json).assertThat("$.Things.Thing.ID", Matchers.equalTo("123"))
    .assertThat("$.Things.Thing.name", Matchers.equalTo("Yet Another Thing"));