2016-08-11 3 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, но принятый ответ просто не работает, потому как fields и fieldNames возвращение iterator, которые не могут быть итерированным через foreach петли только сам по себе as far as I know.

Другие наиболее ответные ответы работают, но мне было интересно, остается ли предположение вышеприведенного фрагмента.

+0

Принимаемые ответы: _Since 'JsonNode # iterator()' не включает ключи_ со ссылкой на javadoc для получения более подробной информации. –

+0

Если вы запутались в инструкции foreach, [здесь] (http://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work), как это работает в отношении ' итератора() '. –

ответ

1

No.

Javadoc из JsonNode#iterator() состояний

же, как вызов elements(); реализован таким образом, что удобство «для-каждого» цикла может быть использовано для цикла по элементам массива JSON конструкций.

И Javadoc из JsonNode#elements() утверждает Метод

для доступа ко всем узлам значение этого узла, если и только если этот узел является JSON массива или объекта узла. В случае узла Object имена полей (ключи) не включены, только значения. Для других типов узлов возвращает итератор.

Таким образом, возвращаемые элементы являются значениями каждой пары ключей и значений узла объекта. Для узлов массива это элементы массива.

+0

Хм, это позор. Мне очень понравилось, как выглядел чистый фрагмент кода. Кроме того, я чувствую, что мне не хватает важной информации о Java. Почему был принят оригинальный ответ, если «итератор» не может быть повторен с помощью цикла 'for'? –

+0

@ THISUSERNEEDSHELP Я не понимаю, что последний вопрос. Если тип реализует 'Iterable', значение этого типа может использоваться в инструкции foreach. –

+0

@ THISUSERNEEDSHELP Кроме того, я понимаю, что ответ там уже содержит мой ответ. –