jackson 對boolean 類型屬性名爲 isXXX 處理

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章