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

时间:2011-11-20 17:57:38

标签: java json jackson

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

我尝试了一个没有数组的简单JSON版本,并且能够使用rootNode.get(“query”)轻松访问单个字符串.get(“pages”)... way在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());
        }

2 个答案:

答案 0 :(得分:9)

也许这篇博文可能有所帮助:Traversing JSON trees with Jackson

我不确定您遇到了哪个问题,但需要注意的一点是,通过传入条目索引来遍历JSON数组,而不是名称。因此,如果您使用objectNode.get("key"),则可以使用arrayNode.get(0)。 或者,如果您想要安全地播放并允许“丢失”条目,请使用arrayNode.path(0)(并且同样适用于JSON对象)。

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

希望这有帮助!

答案 1 :(得分:0)

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

Query{
Pages{
Word[] Links;
}
}

Word{
String word;
String code;
}

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

如果这不具吸引力,请查看here并尝试使用JSONPath

像MongoDB和RavenDB等大量的文档数据库使用JSON作为存储格式。查询复杂的JSON是内置的,使用他们正在使用的相同库。