2011-02-09 12 views
1

私は今、時間、この上で、私の頭を悩まされています:ジャクソンJSONプロセッサの問題

Jscksonは以下CBが、爆弾をデシリアライズ:

BCAの両方のサブクラスであるため、セッターを持っていますgetNameNameの大文字のNは、私のJSONの見た目です。 デシリアライズCは、認識できないフィールド名Nameについて文句を言うと、Bの場合は問題ありません。

バージョン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); 

} 

答えて

2

setNameという名前のセッターに一致するデフォルトのJSONフィールド名がnameであり、Nameではないためです。これは、Javaプロパティ名の規約です。

Bの逆シリアル化は、setNameと一致するフィールド名を変更するmixinを導入したために機能します。

Cのmixinも紹介していただけませんか?

1

あなただけのCは、あなたにもCのためにそれを行うために必要な仕事を得るためにB.

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

に名前-大文字化のアノテーションを追加しました。

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