1. 程式人生 > 實用技巧 >(七) - json處理 - Jackson 進階

(七) - json處理 - Jackson 進階

我們可以新增一些 Jackson 的註解來處理 Jackson 返回的 json 資料.

首先我們建立 JacksonData 類和相關 servlet, 如下所示, 再在此基礎上進行例項說明.

JacksonData.java:

public class JacksonData {
    String jacksonName;
    String jacksonValue;
    Date jacksonDate;

    @Override
    public String toString() {
        return "JacksonData{" +
                "jacksonName='" + jacksonName + '\'' +
                ", jacksonValue='" + jacksonValue + '\'' +
                ", jacksonDate=" + jacksonDate +
                '}';
    }

    
public JacksonData(String jacksonName, String jacksonValue, Date jacksonDate) { this.jacksonName = jacksonName; this.jacksonValue = jacksonValue; this.jacksonDate = jacksonDate; } public JacksonData(){ } public Date getJacksonDate() { return jacksonDate; }
public String getJacksonName() { return jacksonName; } public String getJacksonValue() { return jacksonValue; } public void setJacksonDate(Date jacksonDate) { this.jacksonDate = jacksonDate; } public void setJacksonName(String jacksonName) {
this.jacksonName = jacksonName; } public void setJacksonValue(String jacksonValue) { this.jacksonValue = jacksonValue; } }

TestJackson.java:

@RequestMapping("/jackson")
@RestController
public class TestJackson {

    @RequestMapping("/test1")
    public JacksonData test1(){
        System.out.println("test1");
        JacksonData jacksonData = new JacksonData("name", "張三", new Date());
        return jacksonData;
    }

}

訪問結果:(日期輸出了毫秒數)

一.@JsonFormat

使用者更改輸出的 Date 型別資料的格式

在 JacksonData.java 中為 Date 資料新增如下註解:

public class JacksonData {
    String jacksonName;
    String jacksonValue;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    Date jacksonDate;
...

訪問結果:(日期已顯示規範格式, 但預設時區非東八區)

修改註解:

public class JacksonData {
    String jacksonName;
    String jacksonValue;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    Date jacksonDate;
...

訪問結果:(東八區時間)

二.@JsonIgnore

添加了該屬性的值將不會出現在返回的 json 資料中.

修改註解:

public class JacksonData {
    @JsonIgnore
    String jacksonName;
    String jacksonValue;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    Date jacksonDate;
...

訪問結果:(無 jacksonName)

三.@JsonInclude(JsonInclude.Include.NON_NULL) 和@JsonInclude(JsonInclude.Include.NON_EMPTY)

添加了@JsonInclude(JsonInclude.Include.NON_NULL) 的屬性, 若其值為 null, 則不展示(否則會顯示值為 null), 但如果是一個空的陣列或物件等時(即內容為空)仍會展示;

添加了@JsonInclude(JsonInclude.Include.NON_EMPTY) 的屬性, 當其值為 null 或空時, 都不展示.

四.@JsonProperty

預設情況下, json 中的 key 值和類中的屬性名是相同的, 此註解用來重新命名.

修改註解:

public class JacksonData {
    @JsonIgnore
    String jacksonName;
    @JsonProperty("value")
    String jacksonValue;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    Date jacksonDate;
...

訪問結果:(jacksonValue -> value)

五.@JsonSerialize

為展示的資料新增修飾器, 修飾器可自定義.

建立 MySerializer.java:(用於將資料進行四捨五入並返回處理後的值)

public class MySerializer extends JsonSerializer<Double> {
    @Override
    public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        //將Double jacksonAmount的值 四捨五入
        String number = BigDecimal.valueOf(value).setScale(2,BigDecimal.ROUND_HALF_UP).toString();
        //輸出 四捨五入後的值
        gen.writeNumber(number);
    }
}

在 JacksonData.java 中新建 JacksonAmount 屬性, 並添加註解:@JsonSerialize(using = MySerializer.class)

public class JacksonData {
    @JsonIgnore
    String jacksonName;
    @JsonProperty("value")
    String jacksonValue;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    Date jacksonDate;
    @JsonSerialize(using = MySerializer.class)
    Double jacksonAmount;
...

在 servlet 中, 為 jacksonAmount 賦值100000.873:

...
    public JacksonData test1(){
        System.out.println("test1");
        JacksonData jacksonData = new JacksonData("name", "張三", new Date(), 100000.873);
        return jacksonData;
    }
...

訪問結果:(被四捨五入為 100000.87)