对日期类型的数据进行序列化和反序列化时,需要考虑如下问题:
1. 序列化时,Date对象序列化的字符串日期格式如何
2. 反序列化时,把日期字符串序列化为Date对象,也需要考虑日期格式问题
3. Date A -> str -> Date B,A和B对象是否equals
默认序列化和反序列化
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Tests { public static void main(String[] args) { Model m = new Model(); Date d = new Date(); System.out.println(new Date()); //Wed Aug 13 13:27:01 CST 2014 m.setDate(d); String str = new Gson().toJson(m); System.out.println(str); //{"date":"Aug 13, 2014 1:27:01 PM"} m = new Gson().fromJson(str, Model.class); System.out.println(d.getTime()); //1407907621908 System.out.println(m.getDate().getTime()); //1407907621000 System.out.println(d.equals(m.getDate())); //false } }
1. System.out.println(new Date()),日期格式根据操作系统的Locale,这里是CST(中国标准时间,东八区),而Gson把Date序列化为字符串时,默认的时间格式是GMT标准时间
2. 将Date对象A序列化,然后把得到的日期字符串进行反序列化得到对象B,此时B和A并不相等!!这是为什么?原因是JSON在将日期字符串反序列化时,默认将毫秒数进行割断,所以输出的毫秒数最后是3个0,Gson应该提供方法把这种默认的转换(数据已失真)替换掉
指定序列化和反序列化的日期格式
使用GsonBuilder的setDateFormat来指定Date对象序列化的日期格式以及日期字符串反序列化为Date对象的日期格式
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Tests { public static void main(String[] args) { Model m = new Model(); Date d = new Date(); System.out.println(new Date()); //Wed Aug 13 13:36:32 CST 2014 m.setDate(d); Gson gson = new GsonBuilder().setDateFormat("YYYY-MM-dd HH:mm:ss").create(); String str = gson.toJson(m); System.out.println(str); //{"date":"2014-08-13 13:36:32"} m = gson.fromJson(str, Model.class); System.out.println(d.getTime()); //1407908192881 System.out.println(m.getDate().getTime()); //1388295392000 } }
1.使用GsonBuilder.setDateFormat()可以按照指定的日期格式进行序列化和反序列化,
2.同样,这种方式下,反序列化回来的日期对象,毫秒数依然被割断
注意的问题
我们可以按照指定的日期格式进行序列化和反序列化,但是格式必须要一致,否则就会发生解析错误,比如下面的代码序列化和反序列化使用的日期格式不一致,导致反序列化失败
import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Model { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } public class Tests { public static void main(String[] args) { Model m = new Model(); Date d = new Date(); System.out.println(new Date()); //Wed Aug 13 13:36:32 CST 2014 m.setDate(d); String str = new Gson().toJson(m); System.out.println(str); //{"date":"Aug 13, 2014 1:42:13 PM"} Gson gson = new GsonBuilder().setDateFormat("YYYY-MM-dd HH:mm:ss").create(); //Exception /*Caused by: java.text.ParseException: Unparseable date: "Aug 13, 2014 1:43:37 PM" at java.text.DateFormat.parse(DateFormat.java:357) at com.google.gson.DefaultDateTypeAdapter.deserializeToDate(DefaultDateTypeAdapter.java:105) ... 15 more*/ gson.fromJson(str, Model.class); } }
反序列化时,毫秒数被割断问题,以后再看什么回事
相关推荐
Gson解析之自定义序列化和反序列化的代码例子,但后端对同一个字段给的数据类型与文档不一致时的处理
fastjson、gson、jackson序列化和反序列化所用json文件
实现了通过gson对enum的自定义转化过程,不需要预先定义enmu,并且不需要修改gson源码,在框架顶层处理基本可以达到对enum的抽象管理。
fastJosn Gson Jackson 序列化和反序列化所需要的jar,已经全部验证过,请放心使用咯
Gson 中解决 json 反序列化时相同属性对应不同类型的值的问题(代码),对应文章链接:https://blog.csdn.net/ZiFung_Yip/article/details/89143255
1.3 数组和List的序列化/反序列化 1.3.1 数组的序列化/反序列化 1.3.2 List集合的序列化/反序列化 1.4 Set和Map的序列化/反序列化 1.4.1 Set集合的序列化/反序列化 1.4.2 Map集合的序列化/反序列化 1.5 Map的value为...
目标提供简单的toJson()和fromJson()方法将Java对象转换为JSON,反之亦然允许将已有的不可修改的对象与JSON相互转换Java泛型的广泛支持允许对象的自定义表示支持任意复杂的对象(具有深层继承层次结构和泛型类型的...
集成多枚举类型统一序列化/反序列化处理,再也不用创建多个Adapter了 http://blog.csdn.net/atm008/article/details/51733849
GSON是Google开发并开源的一个Java的JSON转换库,这里我们将来讲解GSON实现Java对象的JSON序列化与反序列化的实例教程,需要的朋友可以参考下
主要讲述Json序列化与反序列化,主要使用Gson、FastJson、Jackson实现
protostuff fastjson gson 高性能序列化jar包
gson-2.0.1.jar-Json解析工具,序列化反序列化,实体类互转Json,免费jar包
Android基于Gson序列化和反序列化,用于存储对象到xml和从xml中解析对象
gson序列化,反序列化工具包,用来做工具报表使用,
可以将一个JSON字符串转成一个Java对象(反序列化),或者反过来(序列化)。 GSON地址:google/gson (github.com) Android引入GSON: implementation ‘com.google.code.gson:gson:2.9.0’ Gson 是 Google 提供的...
Gson jackson fastjson LoganSquare 使用demo Gson jackson fastjson LoganSquare 使用demo
Google gson库能够实现定制化的序列化和反序列操作,能够简化Java序列化和反序列化操作
各种序列化工具类,包括Gson, Jackson, FastJson, ProtoBuf以及proto.exe,希望大家喜欢
Gson反序列化原理 原理简述 gson反序列化主要分为两个过程: 根据TypeToken创建出对象 根据json字符串解析数据,对对象属性赋值 对象的创建 ConstructorConstructor.get 先尝试获取无参构造函数 失败则尝试...
使用Jackson进行json序列化的小例子。