(七) - 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)