java中的JsonSerializer用法
背景
今天在寫(xiě)項(xiàng)目的時(shí)候遇到一個(gè)問(wèn)題,項(xiàng)目中有個(gè)類中有創(chuàng)建時(shí)間和更新時(shí)間兩個(gè)屬性,但是單位在后端用的是Date,而前端給的API中用的是秒。這就涉及到單位的轉(zhuǎn)換問(wèn)題。但是如何優(yōu)雅地對(duì)單位進(jìn)行轉(zhuǎn)化呢?
演示
解決方法
利用@JsonSerialize注解,可以方便地實(shí)現(xiàn)將date數(shù)據(jù)轉(zhuǎn)換成long型數(shù)據(jù)等功能,該注解作用在屬性的getter()方法上。
1. 寫(xiě)一個(gè)負(fù)責(zé)轉(zhuǎn)換的類,繼承自JsonSerializer類,里面寫(xiě)好規(guī)則
public class Date2LongSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {//把Date轉(zhuǎn)成Long jsonGenerator.writeNumber(date.getTime() / 1000); } }
2. 在返回的參數(shù)里加上注解@JsonSerialize(using = XXX.class) XXX為上一步新建的轉(zhuǎn)換類
//創(chuàng)建時(shí)間 @JsonSerialize(using = Date2LongSerializer.class)//時(shí)間戳將Date轉(zhuǎn)成Long private Date categoryTime; //修改時(shí)間 @JsonSerialize(using = Date2LongSerializer.class) private Date updateTime;
這樣就完成了時(shí)間戳的轉(zhuǎn)換。
JackJson中自定義JsonSerializer使用
最近在做一個(gè)需求,一個(gè)時(shí)間字段,數(shù)據(jù)庫(kù)類型為timestamp,默認(rèn)值為'1970-01-01 08:00:01',產(chǎn)品要求這種情況展示為“-1”,實(shí)體類中的屬性類型為Date,我也不能把Date屬性值設(shè)置為“-1”,又不想新加一個(gè)String類型的屬性,那怎么辦呢?
遇到這種問(wèn)題,可以使用JackJson的@JsonSerialize,具體實(shí)現(xiàn)如下:
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、在實(shí)體類的字段上
使用@JsonSerialize注解,并且指定要使用的Serializer
/** * 日期(精確到月) */ @JsonSerialize(using = DefaultTimeSerializer.class) private Date Time;
3、使用效果
其實(shí)使用SpringBoot的@RestController注解,我們最終返回的結(jié)果集都會(huì)被轉(zhuǎn)換為Json信息,那么就沒(méi)有類型而言,因?yàn)槎际荢tring格式的了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://www.cnblogs.com/xiaozhengtongxue/p/13442727.html