使用 Jackson 从 JSON 数组中检索字符串

2022-09-04 22:00:43

我已经找到了几个接近我想要做的答案,但还不够,以至于我能够让它发挥作用。我有一堆看起来像这个例子的JSON(实际上只有几个层次的深度,在我想要访问的级别上有数百个项目):。我无法更改格式;它是别人的API。有很多我不需要的;事实上,我只想要一个数组[“bobsyeruncle”,“easyaspie”]。(或列表或其他任何内容。{"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}

我尝试了一个没有数组的更简单版本的JSON,并且能够使用rootNode.get(“query”).get(“pages”)轻松访问单个字符串。https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608 中描述的方式。但是我无法以这种方式到达阵列。我在这里找到的大多数答案都假设我想创建一个像“链接”这样的POJO,它同时包含“单词”和“代码”,而我没有。为了访问我想要的字符串,是否有必要创建一个类似于“链接”列表的东西,其中包括“单词”和“代码”,然后忽略“代码”?这似乎不对。

(另外,如果有人能给我指出位于JacksonInFiveMinutes教程和整个javadoc之间的文档/教程,我相信这也会有所帮助。

ETA这有效,我想!

            String theJsonString = "{\"query\":{\"pages\":{\"links\":"
                + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(theJsonString);
        JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links");
        for (int i = 0; i < interestingObjectNode.size(); i ++) {
            System.out.println(interestingObjectNode.get(i).path("word").asText());
        }

答案 1

也许这个博客条目可能会有所帮助:与杰克逊一起遍历JSON树

我不确定您遇到了哪个确切的问题,但需要注意的一件事是,JSON数组是通过传递条目索引而不是名称来遍历的。因此,虽然你会使用 ,但你使用。或者,如果您想安全播放并允许“缺少”条目,请使用(和 JSON 对象同上)。objectNode.get("key")arrayNode.get(0)arrayNode.path(0)

还要记住,您可以在JSON树()和POJO之间返回; 具有多种用于在表示形式之间进行转换的方法(convertValue(),readAsTree(),treeToValue(),valueToTree())。因此,可以对某些部分使用数据绑定,对其他部分使用树模型;有时将子树绑定为POJO,有时只是数据绑定高级并使用树模型访问子树。这是一种非常强大的做事方式,但需要一段时间才能习惯。JsonNodeObjectMapper

希望这有帮助!


答案 2

在Google的GSON中,如果您创建了一个缺少某些属性的POJO,则将忽略相应的JSON。它仅填充具有匹配名称的那些属性。为什么不创建一个这样的类:

Query{
Pages{
Word[] Links;
}
}

Word{
String word;
String code;
}

然后使用LambdaJ来避免编写所有循环来获取单词?

如果这不吸引人,请在此处查看并尝试JSONPath

许多文档数据库,如MongoDB和RavenDB等,都使用JSON作为存储格式。查询复杂的 JSON 内置于其中,使用与它们相同的库。