在Java 中, Boolean isGradudate 這種聲明的屬性,再試用idea 默認生成的get 和 set 方法會默認直接去掉is如下
public Boolean getGraduated() {
return isGraduated;
}
public void setGraduated(Boolean graduated) {
isGraduated = graduated;
}
在序列化和反序列化時,會有所不同。如下demo:(JsonMapper 是jackson實現)
class Demo {
private String realName;
private Integer age;
private Boolean isGraduated;
private Boolean work;
private String account;
private String password;
public Boolean getGraduated() {
return isGraduated;
}
public void setGraduated(Boolean graduated) {
isGraduated = graduated;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getWork() {
return work;
}
public void setWork(Boolean work) {
this.work = work;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Demo{" +
"realName='" + realName + '\'' +
", age=" + age +
", isGraduated=" + isGraduated +
", work=" + work +
", account='" + account + '\'' +
", password='" + password + '\'' +
'}';
}
}
測試方法:
public void testDemo() {
String json = "{\"realName\":\"Victor\",\"age\":22,\"isGraduated\":true,\"work\":true,\"account\":\"aaaaa\",\"password\":\"bbbbb\"}";
Demo fromData = jsonMapper.fromJson(json, Demo.class);
System.out.println(fromData.toString());
Demo demo = new Demo();
demo.setRealName("Joe");
demo.setAge(20);
demo.setAccount("aaaaa");
demo.setPassword("bbbbb");
demo.setGraduated(false);
demo.setWork(true);
System.out.println(jsonMapper.toJson(demo));
}
結果:
Demo{realName='Victor', age=22, isGraduated=null, work=true, account='aaaaa', password='bbbbb'}
{"realName":"Joe","age":20,"work":true,"account":"aaaaa","password":"bbbbb","graduated":false}
Jackson 在反序列化成domain 的時候找不到isGraduate 對應的屬性(set方法setGraduate,根據set後面的屬性名指定json key),所以置爲null;
Jackson 在序列化的時候, get 方法是 getGraduate,所以結果顯示的是 "graduate":false
在demo 裏面, work 同樣是Boolean 類型的,但是命名方式不同, 沒有采用isWork 方式, 所以就會按照普通的屬性進行序列化和反序列化
如果指定想要使用 isGraduate作爲參數, 需要自行寫get 和 set 方法,這樣在序列化和反序列化的時候纔會獲取到對應的屬性名
public Boolean getIsGraduated() {
return isGraduated;
}
public void setIsGraduated(Boolean graduated) {
this.isGraduated = graduated;
}
結果:
Demo{realName='Victor', age=22, isGraduated=true, work=true, account='aaaaa', password='bbbbb'}
{"realName":"Joe","age":20,"isGraduated":false,"work":true,"account":"aaaaa","password":"bbbbb"}
當然,這種情況也可以使用jackson 提供的註解解決:
使用 @JsonProperty 和 @JsonIgnore 處理這種情況
@JsonProperty("isGraduated")
private Boolean isGraduated;
@JsonIgnore
public Boolean getGraduated() {
return isGraduated;
}
public void setGraduated(Boolean graduated) {
isGraduated = graduated;
}
@JsonProperty("isGraduated") 指定屬性名爲 isGraduated, Jackson序列化後顯示成 isGraduated,用在屬性上
@JsonIgnore 忽略指定的字段,不顯示出來, 可用在屬性以及get和set 方法上,用在屬性上,整個屬性不會被顯示
@JsonProperty 用在屬性上,@JsonIgnore 用在get 方法上可以達到目標效果:
Demo{realName='Victor', age=22, isGraduated=true, work=true, account='aaaaa', password='bbbbb'}
{"realName":"Joe","age":20,"work":true,"account":"aaaaa","password":"bbbbb","isGraduated":false}
單獨使用@Jsonproperty在屬性上,在序列化的時候, graduated 和 isGraduated 同時顯示,把 @JsonIgnore 放在get 方法上可以忽略掉graduated 只顯示 isGraduated