Java 如何断言JSON节点的子节点具有指定给它们的特定值?
我有一个JSON字符串,如下所示:Java 如何断言JSON节点的子节点具有指定给它们的特定值?,java,json,jsonpath,Java,Json,Jsonpath,我有一个JSON字符串,如下所示: json = "{\"Things\": \n" + " {\"Thing\": {\n" + " \"ID\":\"123\",\n" + " \"name\":\"Yet Another Thing\",\n" + " \"price\":\"$12.99\",\n" }\n" + " }\n" + "}"; 有没有一种方法可以断言事物的ID是123,
json = "{\"Things\": \n" +
" {\"Thing\": {\n" +
" \"ID\":\"123\",\n" +
" \"name\":\"Yet Another Thing\",\n" +
" \"price\":\"$12.99\",\n" }\n" +
" }\n" +
"}";
有没有一种方法可以断言事物的ID
是123
,而它的名称是同一语句/断言中的“另一个事物”
目前,我似乎无法使用过滤器:
JsonPath.read(json, "$.Things.Thing[?(@.ID == '123')].name")
我得到以下例外情况:
java.lang.IllegalArgumentException:无效的容器对象
这可能是因为上面的JSON字符串中没有数组符号[]
?应该有吗
另一方面,是否有关于使用Hamcrest(带有JSON断言)的良好介绍?我知道官方教程,但我似乎总是弄错
更新:这样做的理由是:如果我得到了几个东西
元素,关于它们的顺序我没有保证(因此我无法匹配东西[1]
(除非我循环遍历它们)),那该怎么办?如何确保一个元素同时具有正确的ID和名称?如果我单独检查孩子们,我是否会冒这样的风险:一个东西有正确的名称,另一个有正确的ID,但没有一个同时有这两个?(这种JSON格式是否可行,或者在这种情况下我是否必须使用数组,比如“Thing”:[{…},{…}],…
注意:我最后尝试使用上面的JsonPath,如下所示:assertEquals(“还有一件事,JsonPath.read(json,$.Things.Things[?(@.ID='123')].name”);
这也可能是例外的原因。另外,我最初在JsonPath邮件列表上问了这个问题,但到目前为止还没有得到任何答复,所以我希望能在这里更快地得到帮助…:)本教程为您的问题提供了解决方案,似乎:
JsonAssert.with(json).assertThat("$.Things.Thing.ID", Matchers.equalTo("123"))
.assertThat("$.Things.Thing.name", Matchers.equalTo("Yet Another Thing"));
为什么只有一种说法?你可以使用几个。。。您还可以使用JSON模式或JSON指针,而不仅仅是Map things=parsedJson.getMap(“things”);Map thing=things.getMap(“thing”);如果(things.getString(“ID”).equals(“123”){name=things.getString(“name”)}
/@fge:我想我在想:如果我得到几个Thing
元素(关于它们的顺序我不知道/不保证),会怎么样。我想确保我不会出现这样的情况:一个有正确的ID,另一个有正确的名称,但没有一个两者都有。这有意义吗?作为一个从未使用过JSON的人:这会发生在这里吗,或者需要这样的数组:“Thing”:[{…},{…}],…
?您使用的是已定义的API吗?这是你自己的吗?如果你想知道,如果一个对象有重复的键,JSON解析器的行为是未定义的,所以是的,在这种情况下需要一个数组