2011-09-21 4 views
4

Je suis en train de désérialiser un JSON objet dans un objet Java en utilisant l'annotation Jackson sur un "animal" class Abstact:Jackson désérialisation jeton inattendue (END_OBJECT),

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
@JsonSubTypes({@Type(value = Dog.class, name = "chien"), 
@Type(value = Cat.class, name= "chat")}) 

et est une chaîne JSON exemple ici:

{ 
    "name": "Chihuahua", 
    "type": { 
       "code": "chien", 
       "description": "Chien mechant" 
      } 
} 

Le problème est que la propriété "type" dans l'objet JSON est également un objet. lorsque je tente de i désérialiser avoir cette exception:

Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id '{' into a subtype of [simple type, class Animal] 

J'ai essayé d'utiliser la valeur « type.code » comme « la propriété » mais rien. l'Exception est ce

Caused by: org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type.code' that is to contain type id (for class Animal) 

Une idée de ce qui ne va pas. Je vous remercie.

Répondre

-3

Je suis débutant avec jackson mais je pense que vous devez rechercher l'analyse syntaxique des arbres comme expliqué here

+0

Sans objet ... – FazoM

+0

Si vous le souhaitez :). – FazoM

0

Lancer ce là après avoir trouvé aucune solution à ce problème. Je suis venu avec mon propre style si cela intéresse quelqu'un qui trébuche sur cela. N'hésitez pas à ajouter vos propres solutions si vous trouvez un autre moyen.

J'ai mis en œuvre dans mes énumérations pour résoudre ce problème a été d'ajouter une méthode findByType qui vous permet de rechercher sur une représentation sous forme de chaîne de la valeur de clé enum. Donc, dans votre exemple, vous avez un ENUM avec une paire clé/valeur en tant que telle,

pubilc enum MyEnum { 
... 
CHIEN("chien", "Chien mechant") 
... 
} 
// Map used to hold mappings between the event key and description 
private static final Map<String, String> MY_MAP = new HashMap<String, String>(); 

// Statically fills the #MY_MAP. 
static { 
    for (final MyEnum myEnum: MyEnum.values()) { 
     MY_MAP.put(myEnum.getKey(), myEnum); 
    } 
} 

et vous auriez une méthode publique findByTypeCode qui retourne le type de la clé que vous recherchez sur:

public static MyEnum findByKey(String pKey) { 
    final MyEnum match = MY_MAP.get(pKey); 
    if (match == null) { 
     throw new SomeNotFoundException("No match found for the given key: " + pKey); 
    } 
    return match; 
} 

J'espère que cela aide. Comme je l'ai dit, il existe peut-être une solution qui s'attaque directement à ce problème, mais je n'en ai pas trouvé et je n'ai pas besoin de perdre plus de temps à chercher une solution lorsque cela fonctionne assez bien.

+0

Ajout de ceci fonctionnerait @JsonIgnoreProperties (ignoreUnknown = true) –

Questions connexes