2017-01-16 4 views
1

Je souhaite (dé) marshaler un objet qui contient un champ this type. Bien que la sérialisation fonctionne bien, je ne suis pas capable de le désérialiser. Les classes d'implémentation ne sont pas sous mon contrôle. Je suppose qu'en général, il n'est pas possible de désérialiser la classe d'implémentation d'origine en raison de constructeurs et/ou de setters manquants.Jackson désérialise les types polymorphes qui ne sont pas sous mon contrôle

D'autre part je veux enregistrer toutes les informations (en tant qu'objet java) contenues dans le json.

Quelles sont mes options pour y parvenir, y at-il de bonnes ou de bonnes pratiques?

Répondre

1

Vous pouvez utiliser Jackson Mixins pour simuler une annotation @JsonDeserialize(using=CostumDeserializer.class) sur la classe/le champ en question. Ensuite, vous pouvez essayer de créer les instances vous-même dans la classe deserializer donnée.

// I'm not sure whether annotations (@JsonTypeInfo) on class level are supported as well to allow the polymorphistic type decision. 
abstract class MixIn { 

    // make constructor usable if available 
    MixIn(@JsonProperty("id") int a, @JsonProperty("name") String b) { } 

    @JsonDeserialize(using=CostumDeserializer.class) abstract TypeX getTypeX(); 

} 

Et vous pouvez l'utiliser comme cette

objectMapper.addMixIn(TypeXContainer.class, MixIn.class); 

Doks: http://wiki.fasterxml.com/JacksonMixInAnnotations