jackSon中@JsonInclude註解詳解

 場景:實體類中的某個字段爲特定值/空的話,就不需要序列化該字段保存到xml文件中。

 

@JsonInclude用法:

JsonInclude.Include.ALWAYS 這個是默認策略,任何情況下都序列化該字段,和不寫這個註解是一樣的效果。
JsonInclude.Include.NON_NULL 這個最常用,即如果加該註解的字段爲null,那麼就不序列化這個字段了。
JsonInclude.Include.NON_ABSENT 這個包含NON_NULL,即爲null的時候不序列化,詳情看源碼。

JsonInclude.Include.NON_EMPTY 這個屬性包含NON_NULL,NON_ABSENT之後還包含如果字段爲空也不序列化。

JsonInclude.Include.NON_DEFAULT 這個屬性是如果該字段爲默認值的話就不序列化。

JsonInclude.Include.USE_DEFAULTS 使用默認值的情況下就不序列化。

JsonInclude.Include.CUSTOM 這個是自定義包含規則,官方的解釋如下:

如果使用@JsonInclude#value=JsonInclude.Include.CUSTOM並通過@JsonInclude#value filter指定一個篩選器類,則僅當該屬性值未被篩選器類篩選時,纔會對其進行序列化。filter類的equals()方法用於篩選值;如果返回“true”,則不序列化值。

類似地,如果使用@JsonInclude#content=JsonInclude.Include.CUSTOM並通過@JsonInclude#content filter指定篩選器類,則如果篩選器類的equals方法返回true,則不會序列化目標屬性的內容值。

注:fasterxml.jackson的相關版本2.8不支持,小編使用的是2.10version

 

Example

package com.logicbig.example;



import com.fasterxml.jackson.annotation.JsonInclude;

import java.util.Date;

import java.util.Map;



public class Employee {

    private String name;

    @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = DateOfBirthFilter.class)

    private Date dateOfBirth;

    @JsonInclude(content = JsonInclude.Include.CUSTOM, contentFilter = PhoneFilter.class)

    private Map<String, String> phones;



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public Date getDateOfBirth() {

        return dateOfBirth;

    }



    public void setDateOfBirth(Date dateOfBirth) {

        this.dateOfBirth = dateOfBirth;

    }



    public Map<String, String> getPhones() {

        return phones;

    }



    public void setPhones(Map<String, String> phones) {

        this.phones = phones;

    }

}
Filter Class
package com.logicbig.example;



import java.util.Date;



public class DateOfBirthFilter {



    @Override

    public boolean equals(Object obj) {

        if (obj == null || !(obj instanceof Date)) {

            return false;

        }

        //date should be in the past

        Date date = (Date) obj;

        return !date.before(new Date());

    }

}
package com.logicbig.example;



import java.util.regex.Pattern;



public class PhoneFilter {

    private static Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");



    @Override

    public boolean equals(Object obj) {

        if (obj == null || !(obj instanceof String)) {

            return false;

        }

        //phone must match the regex pattern

        return !phonePattern.matcher(obj.toString()).matches();

    }

}

 

 

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