2011-07-01 13 views
11

Próbuję skonfigurować niestandardowy deserializator Jackson JSON, aby przekonwertować wartości JSON na obiekt Long. Postępowałem zgodnie z instrukcjami na tej stronie: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers, aby skonfigurować niestandardowy deserializer.Konfigurowanie niestandardowego deserializatora JSON

Jednak dla niestandardowego deserializatora, który ma zostać uruchomiony, muszę zawsze dodawać adnotacje za każdym razem: np.

public class TestBean { 
    Long value; 

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

Czy istnieje sposób, aby powiedzieć Jacksona, aby zawsze używać niestandardowego Deserializator deserializacji długo bez konieczności korzystania @JsonDeserialize (używając = LongJsonDeserializer.class) adnotacja za każdym razem?

Odpowiedz

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); 

Oto pełna aplikacja demo. Działa to z najnowszą wersją Jacksona i prawdopodobnie także z wersjami Jacksona sięgającymi 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

Jest to to samo, co opisane w http://wiki.fasterxml.com/JacksonHowToCustomDeserializers, które już śledziłem! – missionE46

+0

Ah. Zbyt szybko przeczytałem pierwotne pytanie. Kolejne spojrzenie ... –

+0

To, co pierwotnie napisałem, dotyczyło pytania, które zadawałeś poprawnie. Zaktualizuję ten post za pomocą pełnej wersji demonstracyjnej. –

Powiązane problemy