java中的JsonSerializer用法,前后端單位轉(zhuǎn)換必備
java中的JsonSerializer用法
背景
今天在寫項(xiàng)目的時(shí)候遇到一個(gè)問題,項(xiàng)目中有個(gè)類中有創(chuàng)建時(shí)間和更新時(shí)間兩個(gè)屬性,但是單位在后端用的是Date,而前端給的API中用的是秒。這就涉及到單位的轉(zhuǎn)換問題。但是如何優(yōu)雅地對單位進(jìn)行轉(zhuǎn)化呢?
演示

解決方法
利用@JsonSerialize注解,可以方便地實(shí)現(xiàn)將date數(shù)據(jù)轉(zhuǎn)換成long型數(shù)據(jù)等功能,該注解作用在屬性的getter()方法上。
1. 寫一個(gè)負(fù)責(zé)轉(zhuǎn)換的類,繼承自JsonSerializer類,里面寫好規(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ù)庫類型為timestamp,默認(rèn)值為'1970-01-01 08:00:01',產(chǎn)品要求這種情況展示為“-1”,實(shí)體類中的屬性類型為Date,我也不能把Date屬性值設(shè)置為“-1”,又不想新加一個(gè)String類型的屬性,那怎么辦呢?
遇到這種問題,可以使用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é)果集都會被轉(zhuǎn)換為Json信息,那么就沒有類型而言,因?yàn)槎际荢tring格式的了。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?NIO緩沖區(qū)Buffer基礎(chǔ)教程示例
這篇文章主要介紹了Java?NIO緩沖區(qū)Buffer基礎(chǔ)教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例
我們見過的很多網(wǎng)站,容許使用第三方賬號登錄,oauth2是用來做三方登錄的,本文就詳細(xì)的介紹springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01
Java泛型枚舉Annotation接口詳細(xì)解讀與Eclipse發(fā)展
這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級問題
這篇文章主要介紹了SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級問題,需要的朋友可以參考下2018-11-11
jenkins中如何集成commander應(yīng)用的完整步驟
jenkins是一個(gè)用java編寫的開源的持續(xù)集成工具,在與oracle發(fā)生爭執(zhí)后,項(xiàng)目從hudson項(xiàng)目獨(dú)立出來,下面這篇文章主要給大家介紹了關(guān)于jenkins中如何集成commander應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05

