2011-07-01 12 views
11

Estoy intentando configurar el deserializador personalizado Jackson JSON para convertir los valores JSON en objetos largos. Seguí las instrucciones en este sitio: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers para configurar el deserializador personalizado.Configuración del deserializador personalizado JSON

Sin embargo, para que el deserializador personalizado entre, siempre tengo que anotar cada vez p. Ej.

public class TestBean { 
    Long value; 

    @JsonDeserialize(using=LongJsonDeserializer.class) 
    public void setValue(Long value) { 
     this.value = value; 
    } 
} 

¿Hay una manera de contar Jackson utilizar siempre la costumbre deserializer deserializar largo sin tener que utilizar @JsonDeserialize (usando = LongJsonDeserializer.class) anotación cada vez?

Respuesta

27
LongJsonDeserializer deserializer = new LongJsonDeserializer(); 

SimpleModule module = 
    new SimpleModule("LongDeserializerModule", 
     new Version(1, 0, 0, null)); 
module.addDeserializer(Long.class, deserializer); 

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

Aquí hay una aplicación de demostración completa. Esto funciona con la última versión de Jackson, y probablemente también con versiones de Jackson que se remontan a 1.7.

import java.io.IOException; 

import org.codehaus.jackson.JsonParser; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.Version; 
import org.codehaus.jackson.map.DeserializationContext; 
import org.codehaus.jackson.map.JsonDeserializer; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.module.SimpleModule; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    TestBean bean = new TestBean(); 
    bean.value = 42L; 

    ObjectMapper mapper = new ObjectMapper(); 

    String beanJson = mapper.writeValueAsString(bean); 
    System.out.println(beanJson); 
    // output: {"value":42} 

    TestBean beanCopy1 = mapper.readValue(beanJson, TestBean.class); 
    System.out.println(beanCopy1.value); 
    // output: 42 

    SimpleModule module = 
     new SimpleModule("LongDeserializerModule", 
      new Version(1, 0, 0, null)); 
    module.addDeserializer(Long.class, new LongJsonDeserializer()); 

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

    TestBean beanCopy2 = mapper.readValue(beanJson, TestBean.class); 
    System.out.println(beanCopy2.value); 
    // output: 126 
    } 
} 

class TestBean 
{ 
    Long value; 
    public Long getValue() {return value;} 
    public void setValue(Long value) {this.value = value;} 
} 

class LongJsonDeserializer extends JsonDeserializer<Long> 
{ 
    @Override 
    public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException 
    { 
    Long value = jp.getLongValue(); 
    return value * 3; 
    } 
} 
+1

Esto es lo mismo que se describe en http://wiki.fasterxml.com/JacksonHowToCustomDeserializers, ¡que ya he seguido! – missionE46

+0

Ah. Leí la pregunta original demasiado rápido, tal vez. Mirando otra vez ... –

+0

Lo que originalmente publiqué respondió la pregunta que hizo correctamente. Actualizaré esta publicación con una aplicación de demostración completa. –

Cuestiones relacionadas