Я меняю свою библиотеку JSON с org.json на Jackson и хочу перенести следующий код:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Сейчас в Джексоне у меня есть следующее:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Однако мне там не нравится актерский состав, есть ли возможность ClassCastException
? Есть ли метод, эквивалентный getJSONArray
in, org.json
чтобы у меня была правильная обработка ошибок, если это не массив?
FAIL_ON_UNKNOWN_PROPERTIES
функцию десериализатора, чтобы просто получить значения NULL, возвращаемые в неиспользуемых полях. Но это, конечно, только вариант, если набор имен полей относительно ограничен.Ответы:
Да, дизайн ручного парсера Джексона сильно отличается от других библиотек. В частности, вы заметите, что у
JsonNode
него есть большинство функций, которые вы обычно связываете с узлами массива из других API. Таким образом, вам не нужно приводитьArrayNode
к объекту для использования. Вот пример:JSON:
Код:
Вывод:
Обратите внимание на использование
isArray
для проверки того, что узел на самом деле является массивом перед повторением. В проверке нет необходимости, если вы абсолютно уверены в своей структуре данных, но она доступна, если она вам понадобится (и это не отличается от большинства других библиотек JSON).источник
В Java 8 это можно сделать так:
источник
Это зависит от вашего вклада; то есть материал, который вы получаете по URL. Если значение атрибута datasets является ассоциативным массивом, а не простым массивом, вы получите
ClassCastException
.Но опять же, правильность вашей старой версии также зависит от ввода. В ситуации, когда ваша новая версия выдает a
ClassCastException
, старая версия выдаетJSONException
. Ссылка: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)источник
Я предполагаю, что в конце дня вы захотите использовать данные в ArrayNode, повторяя их. Для этого:
или если вам нравятся потоки и лямбда-функции:
источник