2011-11-20 26 views
9

我发现了几个与我正在尝试做的事情接近的答案,但还没有足够让我能够实现它。我有一堆看起来像这个例子的JSON(实际上只有几个级别更深,并且有数百个物品在我想访问的级别):{"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}。我无法改变格式;它是别人的API。我不需要很多这样的东西;实际上我只想要一些像[“bobsyeruncle”,“easyaspie”]的数组。 (或一个列表或任何)使用Jackson从JSON数组中检索字符串

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

回答

7

也许这个博客条目可能有所帮助: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,其他时候只是数据绑定高级别,并使用树模型访问子树。这是一种非常强大的做事方式,但需要一段时间才能适应。

希望这会有所帮助!

+0

删除我以前的评论 - 我最终到达那里,把上面的一些代码,以防万一谁发现这个问题。 – umbraphile

+0

安全吗?杰克逊用法中的“安全”是什么意思? @StaxMan – gumuruh

+0

安全的意思是,如果你使用'get',并且没有匹配的节点,它将返回null,并且必须被检查。但是'路径'会返回虚拟的“缺失节点”,因此不需要进行空值检查。 – StaxMan

0

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

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

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

如果不是有吸引力的外观here并尝试JSONPath

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

+1

留下你为什么给予反对票的评论?如果是代码 - 它显然是一个伪代码,它解释了各种POJO类的组成。 – Zasz

+0

原始问题表明不希望使用POJO定义,所以也许只是改进措辞来表明不是他的方法,而是考虑数据绑定?(同上使用杰克逊vs gson) – StaxMan