Игнорирование новых полей в JSON-объектах с помощью Jackson
Я использую библиотеку Jackson для работы с JSON в приложении на Android, чтобы преобразовывать JSON-объекты в POJO-классы. Проблема заключается в том, что JSON-объекты могут изменяться, и во время работы приложения могут добавляться новые поля. В настоящее время добавление даже простого текстового поля приводит к сбоям, хотя эти поля могли бы быть безопасно проигнорированы.
Существует ли способ сообщить Jackson игнорировать новые, несуществующие в POJO-полях? Глобальная настройка игнорирования была бы отличным решением.
5 ответ(ов)
В дополнение к уже упомянутым двум механизмам, существует также глобальная настройка, которую можно использовать для подавления всех ошибок, вызванных неизвестными (неотображёнными) свойствами:
// jackson 1.9 и ранее
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// или jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Эта настройка является значением по умолчанию в отсутствие аннотаций и может стать удобным запасным вариантом.
Это можно добиться двумя способами:
Пометить ваш POJO класс, чтобы игнорировать неизвестные свойства:
@JsonIgnoreProperties(ignoreUnknown = true)
Настроить
ObjectMapper
для сериализации/десериализации POJO/json следующим образом:ObjectMapper mapper = new ObjectMapper(); // для версии Jackson 1.X mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // для версии Jackson 2.X mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Оба этих метода помогут вам избежать ошибок при десериализации, если в JSON содержатся дополнительные поля, которые не соответствуют вашему POJO.
@JsonIgnoreProperties(ignoreUnknown = true)
отлично сработал для меня. У меня есть Java-приложение, которое работает на Tomcat с JDK 1.7. Этот аннотация помогает игнорировать неизвестные свойства в JSON, что особенно полезно, когда структура данных может меняться или когда вы не хотите, чтобы приложение выбрасывало исключение при наличии дополнительных полей в JSON-ответе. Это действительно полезное решение для обеспечения стабильности приложения.
Если вы используете класс POJO на основе JSON-ответа, и есть вероятность, что структура JSON будет часто изменяться, рекомендуется задать на уровне класса POJO следующее:
@JsonIgnoreProperties(ignoreUnknown = true)
Кроме того, при настройке ObjectMapper
добавьте следующий код, если вы выполняете преобразование:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Это позволит избежать поломки кода при возникновении непредвиденных свойств в JSON.
Начиная с версии Jackson 2.4 и выше произошли некоторые изменения. Вот как теперь это делается:
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
..........................................................................
ObjectMapper mapper = new ObjectMapper();
// чтобы избежать исключения при встрече с неизвестным свойством:
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Примечание: Решение с использованием аннотаций остается прежним, поэтому, если вы предпочитаете этот подход, смотрите другие ответы.
Для получения дополнительной информации ознакомьтесь с 10-минутным уроком по конфигурации:
https://github.com/FasterXML/jackson-databind
Jackson с JSON: Неузнанное поле, не помеченное как проигнорируемое
Как разобрать JSON в Java
Как заставить Jackson игнорировать поле при сериализации, если его значение равно null?
Как установить Java 8 на Mac
Что значит 'synchronized'?