为Gson设置日期数据的转换格式


为Gson设置日期数据的转换格式

背景

最近准备把一个APP对应的SDK工具的HTTP请求实现方式由Jersey换成HttpClient(现在已经叫做Http Component Client),需要发HTTP Request的时候把对象转换为json,接受HTTP Response的时候再把json转为对象。

选型

我们知道JAVA世界里面主流的JSON转换工具有Jackson,Gson,当然还有我们阿里的fastjson。

其中Jackson算是用的最古老也是应用相当广泛的一种,并且跟SpringBoot高度集成,可以通过SpringBoot的配置文件(profile)直接设置一些属性,非常的方便。

而由于SDK是提供给调用某个APP的工具JAR包,本身不具备独立运行的能力,所以没有导入SpringBoot。

因此考虑使用Gson,顺便学习一下。

问题与解决

一般来写代码来实现我们的需求的过程中都不是一帆风顺,果然这次也不例外。

不过不慌,遇到问题说明学习进步的时候到了,让我们看看这次都碰到了哪些问题。

1. 日期类型转换精度丢失

public static void main(String[] args){
    java.sql.Timestamp time = new Timestamp(System.currentTimeMillis());
    Gson gson = new GsonBuilder().create();
    System.out.println(time.equals(gson.fromJson(gson.toJson(time),
                                                 java.sql.Timestamp.class)));
}

我们考虑上面的代码输出什么,希望是输出true,结果是false。

那么是怎么一回事,调试后一看,原来gson转化的日期数据丢失了毫秒。

抱着严谨的态度调查了一下,原来Gson默认使用yyyy-MM-dd HH:mm:ss的format来进行解析,那我们可以改变这个format吗,答案是可以的。

public static void main(String[] args){
    java.sql.Timestamp time = new Timestamp(System.currentTimeMillis());
    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss.SSS").create();
    System.out.println(time.equals(gson.fromJson(gson.toJson(time),
                                                 java.sql.Timestamp.class)));
}

使用“.SSS”表示三位毫秒。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM