2016-08-11 23 views
0

我正在尝试遍历JsonNode树,并且我写了一个迭代遍历根节点的子节点的下面的代码片段,并从中获取文本,我假设它将是一个字段名称。假设杰克逊根节点的所有孩子都是田野名称是否合理?

JsonNode rootNode = new ObjectMapper().readTree(jsonParser); 
for (JsonNode node : rootNode){ 
    String fieldName = node.asText(); // <- is it safe to assume this? 
    JsonNode value = node.get(fieldName); 
} 

我已阅读this similar post,但接受的答案完全行不通,因为这两个fieldsfieldNames回报iterator,不能仅仅通过自身as far as I know通过foreach循环迭代。

其他最有回报的答案有效,但我想知道上述片段的假设是否仍然有效。

+0

接受的答案状态_因为'JsonNode#iterator()'不包含keys_和一个链接到javadoc的更多细节。 –

+0

如果您对foreach语句感到困惑,请参阅这里http://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work)它如何与'迭代器()'。 –

回答

1

JsonNode#iterator()状态

相同的Javadoc作为调用实现elements();以便方便 “的for-each” 回路可用于遍历JSON阵列构建体的元件。

JsonNode#elements() Javadoc中说明

方法访问该节点的所有值的节点,当且仅当该节点是 JSON数组或对象节点。 对于Object节点,不包含字段名称(键) ,只包含值。对于其他类型的节点,返回空的 迭代器。

所以返回的元素是对象节点的每个键值对的值。对于数组节点,它是数组元素。

+0

嗯,这是一个耻辱。我真的很喜欢这段代码片段的干净程度。另外,我觉得我错过了关于Java的重要信息。为什么原始答案接受,如果迭代器不能通过for循环迭代? –

+0

@THISUSERNEEDSHELP我不明白最后一个问题。如果某个类型实现了'Iterable',则可以在foreach语句中使用该类型的值。 –

+0

@THISUSERNEEDSHELP此外,我现在意识到那里的答案已经包含了我的答案。 –