Джексон Нераспознанное поле - PullRequest
39 голосов
/ 07 декабря 2011

Я использую Джексон для преобразования JSON в класс объектов.

JSON:

{
    "aaa":"111",
    "bbb":"222", 
    "ccc":"333" 
}

Класс объектов:

class Test{
    public String aaa;
    public String bbb;
}

Код:

ObjectMapper mapper = new ObjectMapper();
Object obj = mapper.readValue(content, valueType);

Мой код выдает исключение следующим образом:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "cccc" (Class com.isoftstone.banggo.net.result.GetGoodsInfoResult), not marked as ignorable

И я не хочу добавлять пропеллер в класс Test, я просто хочу, чтобы Джексон преобразовал существующее значение, которое также существует в Test.

Ответы [ 4 ]

80 голосов
/ 07 декабря 2011

Джексон предоставляет несколько различных механизмов для настройки обработки «лишних» элементов JSON.Ниже приведен пример настройки ObjectMapper, а не FAIL_ON_UNKNOWN_PROPERTIES.

import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.annotate.JsonMethod;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    // { "aaa":"111", "bbb":"222", "ccc":"333" }
    String jsonInput = "{ \"aaa\":\"111\",
                          \"bbb\":\"222\",
                          \"ccc\":\"333\" }";

    ObjectMapper mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD,
                         Visibility.ANY);
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,
                     false);

    Test test = mapper.readValue(jsonInput, Test.class);
  }
}

class Test
{
  String aaa;
  String bbb;
}

Для других подходов см. http://wiki.fasterxml.com/JacksonHowToIgnoreUnknown

40 голосов
/ 21 ноября 2012

Начиная с версии Jackson 2.0 внутреннее перечисление (DeserializationConfig.Feature) перемещено в отдельное перечисление (DeserializationFeature):

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

18 голосов
/ 07 января 2014

Если вы используете Jackson 2.0 (fastxml)

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
8 голосов
/ 06 декабря 2016

Важно заранее заметить критическое изменение модели, которое может привести к нарушению бизнес-логики.

Для лучшего контроля над приложением лучше обрабатывать это исключение вручную.

objectMapper.addHandler(new DeserializationProblemHandler() {

            @Override
            public boolean handleUnknownProperty(DeserializationContext ctxt,
                    JsonParser jp, JsonDeserializer<?> deserializer,
                    Object beanOrClass, String propertyName)
                    throws IOException, JsonProcessingException {

                String unknownField = String.format("Ignoring unknown property %s while deserializing %s", propertyName, beanOrClass);
                Log.e(getClass().getSimpleName(), unknownField);
                return true;
            }
        });

Возврат true для обработки UnrecognizedPropertyException

Не игнорировать незаметно нераспознанные поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...