2016-05-11 6 views
2

Я использую библиотеку Jackson JSON для преобразования некоторых объектов JSON в классы POJO. Проблема заключается в том, когда я использую JSON объектов с дублированием свойствами, как:Как использовать Jackson для проверки дублированных свойств?

{ 
    "name":"xiaopang", 
    "email":"[email protected]", 
    "email":"[email protected]" 
} 

Джексон сообщить последнюю пару электронной "email":"[email protected]", а затем разобрать объект.

Я узнал от Does JSON syntax allow duplicate keys in an object?, что происходит при десериализации объекта JSON с повторяющимися свойствами, зависит от реализации библиотеки, либо бросает ошибку, либо использует последний для дублирующего ключа.

Несмотря на накладные расходы на отслеживание всех свойств, есть ли способ сообщить Джексону сообщить об ошибке или исключении, таком как «Дублирующий ключ» в этом случае?

ответ

5

Используйте JsonParser.Feature.STRICT_DUPLICATE_DETECTION

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); 
MyPOJO result = mapper.readValue(json, MyPOJO.class); 

Результаты в:

Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Duplicate field 'email' 

Вы также можете попробовать использовать DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY (more info) Это будет trigggered, если вы десериализации вашу JSON строку/вход Джексону json tree сначала, а затем вам POJO. Можно комбинировать с пользовательскими JsonDeserializer так:

private static class MyPojoDeserializer extends JsonDeserializer<MyPOJO>{ 

    @Override 
    public MyPOJO deserialize(JsonParser p, DeserializationContext ctxt) 
                  throws IOException{ 
     JsonNode tree = p.readValueAsTree(); 
     return p.getCodec().treeToValue(tree, MyPOJO.class); 
    } 
} 

Setup это один раз и использовать его так же, как и раньше:

// setup ObjectMapper 
ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); 
SimpleModule module = new SimpleModule(); 
module.addDeserializer(MyPOJO.class,new MyPojoDeserializer()); 
mapper.registerModule(module); 

// use 
mapper.readValue(json, MyPOJO.class); 

Результат:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Duplicate field 'email' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled 

Другие варианты будут реализовать всю логику самостоятельно в пользовательском десериализаторе или в ваших методах настройки POJO.

+0

Спасибо! Я добавил 'reader.getFactory(). Enable (JsonParser.Feature.STRICT_DUPLICATE_DETECTION);' и он работает хорошо. – taoxiaopang

Смежные вопросы