淺析fastjson2時間序列化和反序列化的簡單使用
在項目中將fastjson升級為fastjson2后,我們遇到了一些與fastjson不完全兼容的問題。本文將探討下fastjson2的時間序列化和反序列化的簡單使用。
時間序列化
在fastjson2
中,若要將Java對象中的時間屬性序列化為JSON字符串,需使用@JSONField
注解指定時間格式,或在序列化時通過方法參數(shù)傳入格式。
// 使用注解指定格式 @JSONField(format = "yyyy-MM-dd") private Date dateField; // 或者在序列化時通過方法參數(shù)傳入格式 String jsonString = JSON.toJSONString(bean, "yyyy-MM-dd");
時間反序列化
與序列化類似,將日期字符串反序列化為Java對象中的時間屬性時,同樣可通過@JSONField
注解或方法參數(shù)指定時間格式。
// 使用注解指定格式 @JSONField(format = "yyyy-MM-dd") private Date dateField; // 或者在反序列化時通過方法參數(shù)傳入格式 Bean bean = JSON.parseObject(jsonString, Bean.class, "yyyy-MM-dd");
fastjson2的默認時間格式
在序列化時間時,默認格式為yyyy-MM-dd HH:mm:ss.SSS
,這與Jackson和fastjson v1的默認13位毫秒值時間戳格式有所不同。
fastjson2
支持配置全局默認時間格式,
- 序列化默認時間格式可通過
JSON.configWriterDateFormat(format)
設(shè)置。 - 反序列化默認時間格式可通過
JSON.configReaderDateFormat(format)
設(shè)置。
其中format
值可以參考下文中的 format說明。
fastjson2的隱藏功能
默認兼容Jackson
、Gson
以及fastjson
的注解,新一些的版本支持通過配置關(guān)閉Jackson
和Gson
的注解兼容,fastjson不支持關(guān)閉(也說不定后面會支持、畢竟Jackson
和Gson
也是后面的版本才添加的支持配置關(guān)閉兼容)。
翻了下fastjson2
的源碼,jackson的30多個注解基本都支持了,但是這個在官方文檔中卻沒有任何說明。
格式化優(yōu)先級
在fastjson2中,時間格式的優(yōu)先級為:JSONField.format > 方法參數(shù)format > 全局配置
。
format說明
- iso8601:遵循ISO 8601標準格式,如
2024-12-27T11:22:48.404+08:00
。 - millis:13位時間戳,。
- unixtime:10位時間戳,。
- 其他格式:遵循Java的
SimpleDateFormat
標準,如yyyy-MM-dd HH:mm:ss
。
時間格式化組件
以下列出了Java日期和時間格式化中常用的組件及其含義:
特別注意,這里是區(qū)分大小寫字母的,比如y
和Y
在日期格式化中有不同含義,y
表示當(dāng)前日期歸屬年份,而Y
表示當(dāng)前周歸屬的年份,這在年末時可能導(dǎo)致日期顯示錯誤。
組件 | 描述 | 格式 | 示例 |
---|---|---|---|
G | 年代指示符 | 文本 | AD(公元) |
y | 年份 | 年份 | 1996;96 |
Y | 周年份(基于周計算) | 年份 | 2009;09 |
M | 年中的月份(上下文敏感) | 月份 | July;Jul;07 |
L | 年中的月份(獨立形式) | 月份 | July;Jul;07 |
w | 年中的周數(shù) | 數(shù)字 | 27 |
W | 月中的周數(shù) | 數(shù)字 | 2 |
D | 年中的天數(shù) | 數(shù)字 | 189 |
d | 月中的天數(shù) | 數(shù)字 | 10 |
F | 月中的星期天數(shù) | 數(shù)字 | 2 |
E | 星期中的天數(shù)名稱 | 文本 | Tuesday;Tue |
u | 星期中的天數(shù)編號(1=星期一,...,7=星期日) | 數(shù)字 | 1 |
a | 上午/下午標記 | 文本 | PM |
H | 一天中的小時(0-23) | 數(shù)字 | 0 |
k | 一天中的小時(1-24) | 數(shù)字 | 24 |
K | 上/下午中的小時(0-11) | 數(shù)字 | 0 |
h | 上/下午中的小時(1-12) | 數(shù)字 | 12 |
m | 小時中的分鐘 | 數(shù)字 | 30 |
s | 分鐘中的秒 | 數(shù)字 | 55 |
S | 毫秒 | 數(shù)字 | 978 |
z | 時區(qū) | 一般時區(qū) | Pacific Standard Time;PST;GMT-08:00 |
Z | 時區(qū) | RFC 822時區(qū) | -0800 |
X | 時區(qū) | ISO 8601時區(qū) | -08;-0800;-08:00 |
時間格式化組件說明
代碼示例
以下是使用fastjson2進行時間序列化和反序列化的示例代碼。
代碼中用到的fastjson版本是 1.2.83,fastjson2版本是2.0.53。
fastjson2 Maven依賴:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.53</version> </dependency>
fastjson Maven依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
測試類
public class DemoTest { public static void main(String[] args) { //序列化 testToJSONString(); //fastjson 序列化 和2進行一個對比 testFastJson1ToJSON(); //解析為java對象 testParseObject(); } private static void testToJSONString() { Date now = new Date(); Bean bean = new Bean(); bean.setUnixTimeDate(now); bean.setIso8601Date(now); bean.setMillisDate(now); bean.setDefaultDate(now); bean.setDataFormatDate(now); System.out.println("fastjson2 全局配置format前序列化結(jié)果"); System.out.println(JSON.toJSONString(bean)); String format = "millis"; JSON.configWriterDateFormat(format); System.out.println("fastjson2 全局配置format后序列化結(jié)果"); System.out.println(JSON.toJSONString(bean)); System.out.println("fastjson2 方法傳入format序列化結(jié)果"); System.out.println(JSON.toJSONString(bean,"yyyyMMdd")); } private static void testFastJson1ToJSON() { Date now = new Date(); Bean1 bean1 = new Bean1(); bean1.setUnixTimeDate(now); bean1.setIso8601Date(now); bean1.setMillisDate(now); bean1.setDefaultDate(now); System.out.println("fastjson 序列化結(jié)果"); System.out.println(com.alibaba.fastjson.JSON.toJSONString(bean1)); } private static void testParseObject() { String json = "{\n" + " \"dataFormatDate\": \"2024-12-27 10:50:31\",\n" + " \"defaultDate\": \"2024-12-27 10:50:31.555\",\n" + " \"iso8601Date\": \"2024-12-27T10:50:31.555+08:00\",\n" + " \"millisDate\": 1735267831555,\n" + " \"unixTimeDate\": 1735267831\n" + "}"; Bean yyyyMMdd = JSON.parseObject(json, Bean.class); System.out.println("fastjson2 反序列化結(jié)果: " + yyyyMMdd.toString()); } }
fastjson2的測試bean類
public class Bean { @JSONField(format = "millis") private Date millisDate; @JSONField(format = "unixtime") private Date unixTimeDate; @JSONField(format = "iso8601") private Date iso8601Date; @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date dataFormatDate; private Date defaultDate; public Date getDataFormatDate() { return dataFormatDate; } public void setDataFormatDate(Date dataFormatDate) { this.dataFormatDate = dataFormatDate; } public Date getMillisDate() { return millisDate; } public void setMillisDate(Date millisDate) { this.millisDate = millisDate; } public Date getUnixTimeDate() { return unixTimeDate; } public void setUnixTimeDate(Date unixTimeDate) { this.unixTimeDate = unixTimeDate; } public Date getIso8601Date() { return iso8601Date; } public void setIso8601Date(Date iso8601Date) { this.iso8601Date = iso8601Date; } public Date getDefaultDate() { return defaultDate; } public void setDefaultDate(Date defaultDate) { this.defaultDate = defaultDate; } @Override public String toString() { return "Bean{" + "millisDate=" + millisDate + ", unixTimeDate=" + unixTimeDate + ", iso8601Date=" + iso8601Date + ", dataFormatDate=" + dataFormatDate + ", defaultDate=" + defaultDate + '}'; } }
fastjson的測試類
public class Bean1 { @JSONField(format = "millis") private Date millisDate; @JSONField(format = "unixtime") private Date unixTimeDate; // @JSONField(format = "iso8601") @JSONField(serialzeFeatures = SerializerFeature.UseISO8601DateFormat) private Date iso8601Date; private Date defaultDate; public Date getMillisDate() { return millisDate; } public void setMillisDate(Date millisDate) { this.millisDate = millisDate; } public Date getUnixTimeDate() { return unixTimeDate; } public void setUnixTimeDate(Date unixTimeDate) { this.unixTimeDate = unixTimeDate; } public Date getIso8601Date() { return iso8601Date; } public void setIso8601Date(Date iso8601Date) { this.iso8601Date = iso8601Date; } public Date getDefaultDate() { return defaultDate; } public void setDefaultDate(Date defaultDate) { this.defaultDate = defaultDate; } @Override public String toString() { return "Bean1{" + "millisDate=" + millisDate + ", unixTimeDate=" + unixTimeDate + ", iso8601Date=" + iso8601Date + ", defaultDate=" + defaultDate + '}'; } }
運行結(jié)果:
fastjson2 全局配置format前序列化結(jié)果
{"dataFormatDate":"2024-12-27 11:22:48","defaultDate":"2024-12-27 11:22:48.404","iso8601Date":"2024-12-27T11:22:48.404+08:00","millisDate":1735269768404,"unixTimeDate":1735269768}
fastjson2 全局配置format后序列化結(jié)果
{"dataFormatDate":"2024-12-27 11:22:48","defaultDate":1735269768404,"iso8601Date":"2024-12-27T11:22:48.404+08:00","millisDate":1735269768404,"unixTimeDate":1735269768}
fastjson2 方法傳入format序列化結(jié)果
{"dataFormatDate":"2024-12-27 11:22:48","defaultDate":"20241227","iso8601Date":"2024-12-27T11:22:48.404+08:00","millisDate":1735269768404,"unixTimeDate":1735269768}
fastjson 序列化結(jié)果
{"defaultDate":1735269768823,"iso8601Date":1735269768823,"millisDate":1735269768823,"unixTimeDate":1735269768}
fastjson2 反序列化結(jié)果: Bean{millisDate=Fri Dec 27 10:50:31 CST 2024, unixTimeDate=Fri Dec 27 10:50:31 CST 2024, iso8601Date=Fri Dec 27 10:50:31 CST 2024, dataFormatDate=Fri Dec 27 10:50:31 CST 2024, defaultDate=Fri Dec 27 10:50:31 CST 2024}
到此這篇關(guān)于淺析fastjson2時間序列化和反序列化的簡單使用的文章就介紹到這了,更多相關(guān)fastjson2時間序列化和反序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入淺析Random類在高并發(fā)下的缺陷及JUC對其的優(yōu)化
這篇文章主要介紹了Random類在高并發(fā)下的缺陷及JUC對其的優(yōu)化 ,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04java存儲以及java對象創(chuàng)建的流程(詳解)
下面小編就為大家?guī)硪黄猨ava存儲以及java對象創(chuàng)建的流程(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Mybatis mapper標簽中配置子標簽package的坑及解決
這篇文章主要介紹了Mybatis mapper標簽中配置子標簽package的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Feign利用自定義注解實現(xiàn)路徑轉(zhuǎn)義詳解
這篇文章主要講解一下如何通過注解實現(xiàn)對路由中的路徑進行自定義編碼,文中的示例代碼講解詳細,對我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下2022-06-06