Jackson JsonTypeInfo.Comme.EXTERNAL_PROPERTY ne fonctionne pas comme prévu
Je suis à l'aide de Jackson pour parser JSON que je n'ai aucun contrôle dessus. Le JSON ressemble à ceci:
{
"status":"0"
"type":"type1"
"info": {
//additional fields
}
}
Ma classe ressemble à ce
public class Response {
private String status;
private String type;
private Info info
}
La sous-classe de l'Info que j'ai utiliser dépend du type de la propriété, de sorte que mon mapping pour l'info, c'est
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
@JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public abstract class Info {
//some fields
}
Aussi loin que je peux dire que c'est la bonne manière d'utiliser les informations de type lorsque l'élément distinctif est au même niveau que l'élément qui doit être utilisé. Mais cela ne fonctionne pas, j'obtiens toujours la même erreur:
com.fasterxml.jackson.databind.JsonMappingException: Unexpected token
(END_OBJECT), qui devrait FIELD_NAME: manquant de la propriété "type" qui est à
contient un id de type
Si je change EXTERNAL_PROPERTY à la PROPRIÉTÉ, je reçois toujours le même message d'erreur. Est ma compréhension de EXTERNAL_PROPERTY mal?
- J'ai exactement ce problème avec ma conception du EXTERNAL_PROPERTY est censé fonctionner. Avez-vous le faire avancer sur ça?
- Malheureusement pas Marc. Nous avons fini par changer le modèle d'objet complètement pour éviter ce problème.
Vous devez vous connecter pour publier un commentaire.
De Javadoc:
Remarqué que
can only be used for properties
est en caractères gras. Source: JsonTypeInfo.Comme.EXTERNAL_PROPERTY.Donc, vous devez déplacer toutes les annotations de
Info
classe à la propriétéinfo
ousetInfo
méthode dansResponse
classe.Pour moi, vous devez également supprimer
type
propriété deResponse
classe. Il sera généré dynamiquement pendant le processus de sérialisation. Dans la désérialisation vous n'en avez pas besoin, parce que Jackson se soucie de types. Votre classe pourrait ressembler à ceci:Voir aussi cette question: JSON nid classe de liaison de données.