浅析fastjson2时间序列化和反序列化的简单使用

 更新时间:2025年01月02日 10:45:52   作者:pzzhao  
在项目中将fastjson升级为fastjson2后,我们遇到了一些与fastjson不完全兼容的问题,所以本文就来探讨下fastjson2的时间序列化和反序列化的简单使用吧

在项目中将fastjson升级为fastjson2后,我们遇到了一些与fastjson不完全兼容的问题。本文将探讨下fastjson2的时间序列化和反序列化的简单使用。

时间序列化

fastjson2中,若要将Java对象中的时间属性序列化为JSON字符串,需使用@JSONField注解指定时间格式,或在序列化时通过方法参数传入格式。

// 使用注解指定格式
@JSONField(format = "yyyy-MM-dd")
private Date dateField;
 
// 或者在序列化时通过方法参数传入格式
String jsonString = JSON.toJSONString(bean, "yyyy-MM-dd");

时间反序列化

与序列化类似,将日期字符串反序列化为Java对象中的时间属性时,同样可通过@JSONField注解或方法参数指定时间格式。

// 使用注解指定格式
@JSONField(format = "yyyy-MM-dd")
private Date dateField;
 
// 或者在反序列化时通过方法参数传入格式
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)设置。
  • 反序列化默认时间格式可通过JSON.configReaderDateFormat(format)设置。

其中format值可以参考下文中的 format说明。

fastjson2的隐藏功能

默认兼容JacksonGson以及fastjson的注解,新一些的版本支持通过配置关闭JacksonGson的注解兼容,fastjson不支持关闭(也说不定后面会支持、毕竟JacksonGson也是后面的版本才添加的支持配置关闭兼容)。

翻了下fastjson2的源码,jackson的30多个注解基本都支持了,但是这个在官方文档中却没有任何说明。

格式化优先级

在fastjson2中,时间格式的优先级为:JSONField.format > 方法参数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日期和时间格式化中常用的组件及其含义:

特别注意,这里是区分大小写字母的,比如yY在日期格式化中有不同含义,y表示当前日期归属年份,而Y表示当前周归属的年份,这在年末时可能导致日期显示错误。

组件描述格式示例
G年代指示符文本AD(公元)
y年份年份1996;96
Y周年份(基于周计算)年份2009;09
M年中的月份(上下文敏感)月份July;Jul;07
L年中的月份(独立形式)月份July;Jul;07
w年中的周数数字27
W月中的周数数字2
D年中的天数数字189
d月中的天数数字10
F月中的星期天数数字2
E星期中的天数名称文本Tuesday;Tue
u星期中的天数编号(1=星期一,...,7=星期日)数字1
a上午/下午标记文本PM
H一天中的小时(0-23)数字0
k一天中的小时(1-24)数字24
K上/下午中的小时(0-11)数字0
h上/下午中的小时(1-12)数字12
m小时中的分钟数字30
s分钟中的秒数字55
S毫秒数字978
z时区一般时区Pacific Standard Time;PST;GMT-08:00
Z时区RFC 822时区-0800
X时区ISO 8601时区-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前序列化结果");  
        System.out.println(JSON.toJSONString(bean));  
  
        String format = "millis";  
        JSON.configWriterDateFormat(format);  
        System.out.println("fastjson2 全局配置format后序列化结果");  
        System.out.println(JSON.toJSONString(bean));  
  
        System.out.println("fastjson2 方法传入format序列化结果");  
        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 序列化结果");  
        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 反序列化结果: " + 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 +  
                '}';  
    }  
}

运行结果

fastjson2 全局配置format前序列化结果
{"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后序列化结果
{"dataFormatDate":"2024-12-27 11:22:48","defaultDate":1735269768404,"iso8601Date":"2024-12-27T11:22:48.404+08:00","millisDate":1735269768404,"unixTimeDate":1735269768}

fastjson2 方法传入format序列化结果
{"dataFormatDate":"2024-12-27 11:22:48","defaultDate":"20241227","iso8601Date":"2024-12-27T11:22:48.404+08:00","millisDate":1735269768404,"unixTimeDate":1735269768}

fastjson 序列化结果
{"defaultDate":1735269768823,"iso8601Date":1735269768823,"millisDate":1735269768823,"unixTimeDate":1735269768}
fastjson2 反序列化结果: 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}

到此这篇关于浅析fastjson2时间序列化和反序列化的简单使用的文章就介绍到这了,更多相关fastjson2时间序列化和反序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis实现批量插入方法实例

    MyBatis实现批量插入方法实例

    最近在公司项目开发中遇到批量数据插入或者更新,下面这篇文章主要给大家介绍了关于MyBatis实现批量插入的相关资料,需要的朋友可以参考下
    2022-10-10
  • SpringBoot实现钉钉机器人消息推送的示例代码

    SpringBoot实现钉钉机器人消息推送的示例代码

    这篇文章主要介绍了SpringBoot实现钉钉机器人消息推送的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • java连连看游戏菜单设计

    java连连看游戏菜单设计

    这篇文章主要为大家详细介绍了java连连看游戏菜单部分的设计代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 关于Java中finalize析构方法的作用详解

    关于Java中finalize析构方法的作用详解

    构造方法用于创建和初始化类对象,也就是说,构造方法负责”生出“一个类对象,并可以在对象出生时进行必要的操作,在这篇文章中会给大家简单介绍一下析构方法,需要的朋友可以参考下
    2023-05-05
  • SpringMVC中的HandlerAdapter解析

    SpringMVC中的HandlerAdapter解析

    这篇文章主要介绍了SpringMVC中的HandlerAdapter解析,HandlerAdapter是一个关键的组件,用于将请求与处理程序方法进行适配和调度,它充当了控制器和处理程序之间的桥梁,负责将请求的参数和处理程序方法进行匹配,并将结果返回给前端,需要的朋友可以参考下
    2023-10-10
  • Java设计模式之装饰模式原理与用法实例详解

    Java设计模式之装饰模式原理与用法实例详解

    这篇文章主要介绍了Java设计模式之装饰模式原理与用法,结合实例形式详细分析了装饰模式的概念、原理、定义与使用方法,并总结分析了装饰模式的优缺点,具有一定参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • 基于java实现停车场管理系统

    基于java实现停车场管理系统

    这篇文章主要为大家详细介绍了基于java实现停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 关于@Transactional事务嵌套使用方式

    关于@Transactional事务嵌套使用方式

    Spring框架通过@Transactional注解来管理事务,它可以作用于类和方法上,用于声明事务的属性,如传播行为、隔离级别、超时时间等,Spring事务是基于AOP实现的,它在运行时为加了@Transactional注解的方法或类创建代理
    2024-11-11
  • spring cloud eureka注册原理-注册失败填坑笔记

    spring cloud eureka注册原理-注册失败填坑笔记

    这篇文章主要介绍了spring cloud eureka注册原理-注册失败填坑笔记,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 使用jekins自动构建部署java maven项目的方法步骤

    使用jekins自动构建部署java maven项目的方法步骤

    这篇文章主要介绍了使用jekins自动构建部署java maven项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论