Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何断言JSON节点的子节点具有指定给它们的特定值?_Java_Json_Jsonpath - Fatal编程技术网

Java 如何断言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字符串,如下所示:

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解析器的行为是未定义的,所以是的,在这种情况下需要一个数组