2013-11-25 2 views
1

У меня есть POJOПользовательские JSON картирование с использованием Джексона

class Product { 
    String name; 
    Size size; 
} 

Итак, я хочу, чтобы отобразить десериализации JSON в мой POJO. Если у меня есть оба атрибута в моем JSON, это не проблема.

Но в моем случае иногда размер не будет частью JSON. Может существовать третий атрибут «type», на основе которого я установлю свой размер. Я не хочу включать «тип» в свой POJO. Есть ли какие-либо аннотации Джексона, которые могут это сделать?

ответ

1

Найдено довольно простое решение для этого!

Когда атрибут JSON пытается сопоставить с моим атрибутом POJO, он просто проверяет, существует ли для него сеттер.

Например, если есть атрибут type в формате JSON, он будет пытаться ударить метод, названный setType(obj) в моем POJO, независимо от того, существует ли атрибут с именем type.

Это сработало для меня! Я просто устанавливаю другие атрибуты внутри этого сеттера.

3

написать свои собственные Deserializers:

SimpleModule module = 
    new SimpleModule("ProductDeserializerModule", 
     new Version(1, 0, 0, null)); 
module.addDeserializer(Product.class, new ProductJsonDeserializer()); 

mapper = new ObjectMapper(); 
mapper.registerModule(module); 

// ...

class ProductJsonDeserializer extends JsonDeserializer<Product> 
{ 
    @Override 
    public Product deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException 
    { 
    // handle here if exist a third attribute 'type' and create the product 
    } 
} 

Больше информации здесь: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

+0

Попробуй это. Еще одно: на самом деле я называю WebResource, выход JSON которого я пытаюсь сопоставить с моим POJO. Что-то вроде этого: webResource.accept (MediaType.APPLICATION_JSON) .get (Product.class) Как зарегистрировать мой ProductJsonDeserializer с этим? – shiladitya

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