2013-08-29 2 views
1

Depuis le tutoriel j'ai eu l'impression que cela devrait fonctionner (exemple simplifié):Jackson Désérialisation: terrain non reconnu

public class Foo { 
    private String bar; 
    public String getBar() { 
     return bar; 
    } 
    public void setBar(String bar) { 
     this.bar = bar; 
    } 
    public static class Qux { 
     private String foobar; 
     public String getFoobar() { 
      return foobar; 
     } 
     public void setFoobar(String foobar) { 
      this.foobar = foobar; 
     } 
    } 
} 
... 

String in = "{ \"bar\": \"123\", \"qux\" : {\"foobar\": \"234\"}}"; 
ObjectMapper mapper = new ObjectMapper(); 
Foo obj = mapper.readValue(in, Foo.class); 

Cependant, je reçois une erreur

UnrecognizedPropertyException: Unrecognized field "qux" (Class Foo), not marked as ignorable 

Je suis en cours d'exécution 2.2. 2

+0

Pouvez-vous relier le tutoriel? 'ObjectMapper' par défaut essayera de mapper tous vos champs. –

+0

L'exemple "Full Data Binding (POJO)" de http://wiki.fasterxml.com/JacksonInFiveMinutes –

+0

Cet exemple n'affiche aucun champ manquant. Il y a une configuration spéciale que vous devez définir pour les ignorer. Vois ma réponse. –

Répondre

1

Il ne fonctionnera que si vous tirez votre Qux classe de Foo

public class Foo { 
    private String bar; 

    // added this 
    private Qux qux; 

    public String getBar() { 
     return bar; 
    } 
    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    // added getter and setter 
    public Qux getQux() { 
     return qux; 
    } 
    public void setQux(Qux qux) { 
     this.qux = bar; 
    } 
} 

public static class Qux { 
    private String foobar; 
    public String getFoobar() { 
     return foobar; 
    } 
    public void setFoobar(String foobar) { 
     this.foobar = foobar; 
    } 
} 
+0

En effet, il le fait. Merci Monsieur! –

+0

L'emplacement de la classe Qux je doute était la solution. L'ajout de la propriété qux est le remède. –

+0

@BrentWorden Quitter la classe Qux où elle était _could_ aurait fonctionné, mais aurait également demandé l'attribut '@ JsonIgnoreProperties'. –

2

Vous pouvez configurer ObjectMapper ignorer les champs qu'il ne trouve pas dans votre classe avec

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

S'il n'est pas configuré de cette façon, il lèvera des exceptions lors de l'analyse s'il trouve un champ qu'il ne reconnaît pas sur le type de classe spécifié.

2

La classe Foo a besoin d'une propriété d'instance de type Qux pour désérialisation automatique fonctionne. La façon dont la classe Foo est actuellement définie, il n'y a pas de propriété de destination pour injecter les valeurs d'objet JSON qux.

public class Foo { 
    private String bar; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

    // additional property 
    private Qux qux; 

    public Qux getQux() { 
     return qux; 
    } 

    public void setQux(Qux value) { 
     qux = value; 
    } 

    public static class Qux { 
     private String foobar; 

     public String getFoobar() { 
     return foobar; 
     } 

     public void setFoobar(String foobar) { 
      this.foobar = foobar; 
     } 
    } 
} 
Questions connexes