JSON - нетипизированный язык. Таким образом, у вас действительно есть два сценария:
Ситуация # 1 : Вы знаете, какие типы должны иметь эти поля , и хотите безопасно взаимодействовать со значениями.
В этом случае вам либо нужно жестко закодировать приведение к типам, которые, как вы знаете, должны существовать, либо создать класс POJO для десериализации. (Если этот класс используется только в небольшой области, вы можете использовать закрытый класс или даже локальный класс внутри функции, которая его использует.) В любом случае, либо mapper.readValue()
, либо ваш код выдаст исключение, если данные не не совпадают Вам нужно будет либо перехватить это исключение, либо распространить его на своего абонента. Какие именно сбои имеют здесь значение, зависит от вашего приложения, но существует множество возможных сбоев.
Ситуация # 2 : Вы не представляете, какие типы должны иметь эти поля, и вы хотите узнать типы значений, с которыми нужно взаимодействовать.
К сожалению, нет статически проверяемого способа взаимодействия с типами, которые будут неизвестны до времени выполнения. (Это в основном определение различия между статическими и динамическими системами типов.) На практике с десериализацией данных из JSON все будет либо Number
, String
, List<?>
, Map<?, ?>
, либо null
, Таким образом, вам придется разбираться с этими случаями, но даже в пределах List
у вас нет никакого способа узнать, какой тип у каждого элемента, не просматривая и не проверяя каждый из них - и возможно, что единственный тип Java, который вы сможете использовать для представления списка List<?>
(т. е. может быть недопустимый тип, к которому можно использовать подстановочный знак, например, в случае гетерогенного списка).
Тем не менее, относительно редко нужно анализировать структуру данных, которая действительно динамична. Обычно любые данные JSON имеют стандартизированную структуру, и поэтому правильным решением является создание объекта данных (в виде класса Java POJO), который представляет эту структуру, а затем преобразовывает ваши входящие данные в ваш объект. Если данные не могут быть представлены в вашем объекте, это означает, что входящие данные не являются чем-то, что ваша программа готова обработать. В большинстве случаев вам следует немедленно прервать работу с ошибкой, а не пытаться запутаться с данными, которые вы не понимаете (это принцип «быстрого отказа»).