java中的JsonSerializer用法,前後端單位轉換必備

java中的JsonSerializer用法

背景

今天在寫項目的時候遇到一個問題,項目中有個類中有創建時間和更新時間兩個屬性,但是單位在後端用的是Date,而前端給的API中用的是秒。這就涉及到單位的轉換問題。但是如何優雅地對單位進行轉化呢?

演示

解決方法

利用@JsonSerialize註解,可以方便地實現將date數據轉換成long型數據等功能,該註解作用在屬性的getter()方法上。

1. 寫一個負責轉換的類,繼承自JsonSerializer類,裡面寫好規則

public class Date2LongSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {//把Date轉成Long
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}

2. 在返回的參數裡加上註解@JsonSerialize(using = XXX.class) XXX為上一步新建的轉換類

    //創建時間
    @JsonSerialize(using = Date2LongSerializer.class)//時間戳將Date轉成Long
    private Date categoryTime;
    //修改時間
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date updateTime;

這樣就完成瞭時間戳的轉換。

JackJson中自定義JsonSerializer使用

最近在做一個需求,一個時間字段,數據庫類型為timestamp,默認值為’1970-01-01 08:00:01’,產品要求這種情況展示為“-1”,實體類中的屬性類型為Date,我也不能把Date屬性值設置為“-1”,又不想新加一個String類型的屬性,那怎麼辦呢?

遇到這種問題,可以使用JackJson的@JsonSerialize,具體實現如下:

1、自定義類繼承JsonSerializer

public class DefaultTimeSerializer extends JsonSerializer<Date> {
   /**
    * Method that can be called to ask implementation to serialize
    * values of type this serializer handles.
    *
    * @param value       Value to serialize; can <b>not</b> be null.
    * @param gen         Generator used to output resulting Json content
    * @param serializers Provider that can be used to get serializers for
    */
   @Override
   public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
      if (THOUSAND_MILLISECOND.equals(value.getTime())) {
         gen.writeString("-1");
      } else {
         gen.writeString(DateUtils.dateFormat(value, DateUtils.MONTH_PATTERN));
      }
   }
}

2、在實體類的字段上

使用@JsonSerialize註解,並且指定要使用的Serializer

/**
 * 日期(精確到月)
 */
@JsonSerialize(using = DefaultTimeSerializer.class)
private Date Time;

3、使用效果

b70a71ea72bc424a22e8e142c6cc8e8b687.jpg

8e83b36ec9d2e803af65a505ba25248a7b7.jpg

其實使用SpringBoot的@RestController註解,我們最終返回的結果集都會被轉換為Json信息,那麼就沒有類型而言,因為都是String格式的瞭。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: