2011-02-09 70 views
1

我一直在抓我的頭在這幾個小時現在:傑克遜JSON處理器問題

Jsckson反序列化B但下面C炸彈:

BCA兩個子類,因而具有二傳手getName。 請注意,Name中的大寫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,因爲您已經引入了mixin,它改變了與setName匹配的字段名稱。

難道你不能只是引入C也mixin?

1

你只添加了名稱uppercasing批註B.

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

爲了得到C到工作,你需要做的是對C爲好。

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