7

Игнорирование новых полей в JSON-объектах с помощью Jackson

1

Я использую библиотеку Jackson для работы с JSON в приложении на Android, чтобы преобразовывать JSON-объекты в POJO-классы. Проблема заключается в том, что JSON-объекты могут изменяться, и во время работы приложения могут добавляться новые поля. В настоящее время добавление даже простого текстового поля приводит к сбоям, хотя эти поля могли бы быть безопасно проигнорированы.

Существует ли способ сообщить Jackson игнорировать новые, несуществующие в POJO-полях? Глобальная настройка игнорирования была бы отличным решением.

5 ответ(ов)

5

В дополнение к уже упомянутым двум механизмам, существует также глобальная настройка, которую можно использовать для подавления всех ошибок, вызванных неизвестными (неотображёнными) свойствами:

// jackson 1.9 и ранее
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// или jackson 2.0
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Эта настройка является значением по умолчанию в отсутствие аннотаций и может стать удобным запасным вариантом.

0

Это можно добиться двумя способами:

  1. Пометить ваш POJO класс, чтобы игнорировать неизвестные свойства:

    @JsonIgnoreProperties(ignoreUnknown = true)
    
  2. Настроить 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.

0

@JsonIgnoreProperties(ignoreUnknown = true) отлично сработал для меня. У меня есть Java-приложение, которое работает на Tomcat с JDK 1.7. Этот аннотация помогает игнорировать неизвестные свойства в JSON, что особенно полезно, когда структура данных может меняться или когда вы не хотите, чтобы приложение выбрасывало исключение при наличии дополнительных полей в JSON-ответе. Это действительно полезное решение для обеспечения стабильности приложения.

0

Если вы используете класс POJO на основе JSON-ответа, и есть вероятность, что структура JSON будет часто изменяться, рекомендуется задать на уровне класса POJO следующее:

@JsonIgnoreProperties(ignoreUnknown = true)

Кроме того, при настройке ObjectMapper добавьте следующий код, если вы выполняете преобразование:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Это позволит избежать поломки кода при возникновении непредвиденных свойств в JSON.

0

Начиная с версии 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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь