Джексон Неопознанное поле
Я использую jackson для преобразования JSON в класс Object.
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
И я не хочу добавлять prop в класс Test, я просто хочу, чтобы Jackson преобразовал существующее значение whith, также существует в Test.
Ответы
Ответ 1
Jackson предоставляет несколько различных механизмов для настройки обработки "дополнительных" элементов 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
Ответ 2
Как и в случае с Jackson 2.0, внутренняя enum (DeserializationConfig.Feature) была перенесена в автономный enum (DeserializationFeature):
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Ответ 3
Если вы используете Jackson 2.0 (quickxml)
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Ответ 4
Важно заранее заметить критическое изменение модели, которая может привести к поломке бизнес-логики.
Чтобы лучше контролировать приложение, лучше обрабатывать это исключение вручную.
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
Не игнорируйте молчащие непризнанные поля.