2011-07-01 3 views
11

J'essaye de configurer le désérialiseur personnalisé de Jackson JSON pour convertir des valeurs de JSON en objet long. J'ai suivi les instructions sur ce site: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers pour configurer le désérialiseur personnalisé. Cependant, pour que le désérialiseur personnalisé fonctionne, je dois toujours annoter à chaque fois .Configuration du désérialiseur personnalisé JSON

public class TestBean { 
    Long value; 

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

Est-il possible de dire Jackson d'utiliser toujours le désérialiseur personnalisé désérialiser longtemps sans avoir à utiliser l'annotation @JsonDeserialize (en utilisant = LongJsonDeserializer.class) à chaque fois?

Répondre

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

Voici une application de démonstration complète. Cela fonctionne avec la dernière version de Jackson, et probablement aussi avec les versions de Jackson remontant à 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

Ceci est le même que décrit dans http://wiki.fasterxml.com/JacksonHowToCustomDeserializers, que j'ai déjà suivi! – missionE46

+0

Ah. J'ai lu la question originale trop vite, peut-être. Un autre regard ... –

+0

Ce que j'ai posté à l'origine répondait à la question que vous posiez correctement. Je mettrai à jour ce post avec une application de démonstration complète. –

Questions connexes