comment créer un personnalisé JsonDeserializer en Java?
J'ai un Map<A,B> fieldOfC
comme un champ d'une classe C. Quand j'essaie de désérialiser C avec Jackson, une Exception est levée, car il ne peut pas trouver un Deserializer pour la Carte de clé de A. Alors, je pense que la solution est d'étendre StdJsonDeserializer et le faire manuellement.
Mon problème est que je ne peux pas trouver un exemple sur la façon d'utiliser l'analyseur et le contexte de la méthode "désérialiser" que j'ai à mettre en œuvre.
Quelqu'un peut-il écrire le code pour cet exemple simple, donc je peux l'utiliser pour commencer à construire mon vrai deserializer?
public class A{
private String a1;
private Integer a2;
}
public class B{
private String b1;
}
public class C{
@JsonDeserialize(keyUsing=ADeserializer.class)
//also tried this: @JsonDeserialize(keyAs=A.class) without success
private Map<A,B> fieldOfC;
private String c1;
}
public class ADeserializer extends StdKeyDeserializer {
protected ADeserializer(Class<A> cls) {
super(cls);
}
protected Object _parse(String key, DeserializationContext ctxt) throws Exception {
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(key, A.class);
}
}
Merci d'avance
MODIFIER: recherches sur google, j'ai trouvé un test de le même problème que j'ai. C'est exactement mon problème
MODIFIER: modification de la classe étendue de StdDeserializer à StdKeyDeserializer comme je l'ai lu ici dans la méthode findKeyDeserializer(org.codehaus.jackson.map.DeserializationConfig, org.codehaus.jackson.type.JavaType, org.codehaus.jackson.map.BeanProperty)
MODIFIER: Après la résolution de ce problème je l'ai eu cette une qui est lié.
OriginalL'auteur Neuquino | 2011-04-10
Vous devez vous connecter pour publier un commentaire.
Je suis un débutant complet avec Jackson, mais la suivante fonctionne pour moi.
J'ai d'abord ajouter un JsonCreator méthode:
Qui seule permet de résoudre le problème de la désérialisation. La partie la plus difficile pour moi a été la bonne sérialisation des clés. Ce que j'ai fait il y a à définir une touche sérialiseur qui sérialise nommé classes qu'il la sérialisation JSON, comme ceci:
Alors pour prouver que cela fonctionne, la sérialisation et la désérialisation d'une instance de la classe C:
Pour moi, ce produit de la sortie:
Je pense que cela aurait été une meilleure façon de faire dire comment sérialiser la clé en utilisant les annotations, mais je ne pouvais pas travailler.
J'ai utilisé votre solution, la seule chose différente, c'est que j'ai mis en œuvre la méthode serialize sans l'aide de la objectKeys attribut. Mon application est exactement les quatre lignes que vous avez à l'intérieur si le bloc. Maintenant, je vais avoir des problèmes avec la Période de joda-time de la classe, mais je vais faire un nouveau post avec celui-là. Merci, Simon.
OriginalL'auteur Simon G.