2011-02-09 8 views
1

Je suis en me grattant la tête sur ce depuis des heures:Jackson problèmes de processeur JSON

Jsckson désérialise B mais les bombes sur C ci-dessous:

B et C sont les deux sous-classes de A, et a donc un setter getName. Notez que la majuscule N dans Name est intentionnelle, c'est ainsi que mon JSON ressemble. Désérialisation C se plaint de Nom de champ non reconnu Name, pour B c'est OK.

Version 1.7.2

ObjectMapper mapper = new ObjectMapper(); 
mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class); 
String json = "{\"Name\" : \"13\"}"; 
B b = m.readValue(json, B.class); 
System.out.println(b.getName()); 
C c = m.readValue(json, C.class); 
System.out.println(c.getName()); 

public class A { 
    private int id ; 
    private String name; 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

public class B extends A { 
private String address; 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
    } 
} 

public class C extends A { 
    private String country; 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 
} 

@JsonAutoDetect(fieldVisibility = Visibility.NONE,setterVisibility=Visibility.ANY) 
abstract class MixIn { 

    @JsonProperty("Name") 
    public abstract void setName(String name); 

    @JsonProperty("Id") 
    public abstract void setId(int id); 

} 

Répondre

2

Cela est dû au fait que le nom de champ JSON par défaut pour correspondre à un setter appelé setName est name, et non Name. C'est la convention de nom de propriété Java.

La désérialisation fonctionne pour B parce que vous avez introduit le mixin qui modifie le nom du champ correspondant à setName.

Vous ne pouvez pas simplement introduire le mixin pour C aussi?

1

Vous n'ajouté le nom-uppercasing annotations B.

mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class); 

Pour C fonctionne, vous devez le faire pour C ainsi.

mapper.getDeserializationConfig().addMixInAnnotations(C.class, MixIn.class); 
Questions connexes