2016-10-05 2 views
2

J'essaye de désérialiser json en écrivant deserializer personnalisé. Voici mon code.Ajout de la classe de désérialisation personnalisée à l'annotation déjà existante @JsonDeserialize en utilisant jackson

public class EventLoginDeserializer extends StdDeserializer<EventLogin> { 

    public EventLoginDeserializer() { 
     this(null); 
    } 

    public EventLoginDeserializer(Class<EventLogin> event) { 
     super(event); 
    } 

    @Override 
    public EventLogin deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
      throws IOException, JsonProcessingException { 
     JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser); 
     return EventLogin.builder().displayName(jsonNode.get("display_name")) 
       .timestamp(DateTime.now()).build(); 
    } 

    @Override 
    public Class<EventLogin> handledType() { 
     return EventLogin.class; 
    } 
} 

Et voici l'extrait de ma classe principale.

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

SimpleModule module = new SimpleModule(); 
module.addDeserializer(EventLogin.class, new EventLoginDeserializer()); 
mapper.registerModule(module); 

String json = "{\"display_name\": \"Test Deserialization\", \"user_name\": \"test\"}"; 

EventLogin eventLogin = mapper.readValue(json, EventLogin.class); 
System.out.println("readValue :::: " + eventLogin); 

J'ai une exigence où je en ai prendre une classe de modèle annoté @JsonDeserialize déjà existant dans le fichier jar et ajouter une classe de désérialisation ci-dessus. Je voulais dire ici est la même chose de la classe déjà existante dans un fichier source.

@AutoValue 
@JsonDeserialize(builder = AutoValue_EventLogin.Builder.class) 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public abstract class EventLogin 
{ 
    public abstract String displayName(); 
    public abstract DateTime timestamp(); 

    @AutoValue.Builder 
    public abstract static class Builder implements Login.Builder<Builder> { 

    public abstract Builder displayName(String displayName); 
     public abstract Builder emailId(DateTime timestamp); 

     public abstract EventLogin build(); 
    } 
} 

Le problème est que depuis @JsonDeserialize existe déjà dans le fichier jar, ajoutant ainsi désérialiseur sur mesure n'a pas été considéré comme étant du tout. En d'autres termes, la méthode deserialize substituée, la classe deserializer personnalisée n'est pas exécutée.

Alors comment surmonter ce problème? Merci d'avance.

Répondre

0

Allez à la solution. Jackson nous permet de remplacer ces valeurs par des mixins, de sorte que nous puissions créer une classe mixin et l'ajouter dans le mappeur d'objet.

@JsonDeserialize(using = EventLoginDeserializer.class) 
public static class EventLoginMixIn{} 

puis dans notre classe principale

ObjectMapper mapperWithMixin = new ObjectMapper() 
     .addMixIn(EventLogin.class, EventLoginMixIn.class); 

// Deserialize the eventlogin 
EventLogin eventLogin = mapperWithMixin.readValue(actualJson, EventLogin.class);