使用google 的gson 从外部redis反序列化一个 TimeStamp 的字段的对象时候,报错。
Caused by: com.google.gson.JsonSyntaxException: 1534467411000
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:74)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:59)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41)
at com.google.gson.internal.bind.TypeAdapters$26$1.read(TypeAdapters.java:598)
at com.google.gson.internal.bind.TypeAdapters$26$1.read(TypeAdapters.java:596)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
at com.google.gson.Gson.fromJson(Gson.java:887)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
at com.google.gson.Gson.fromJson(Gson.java:773)
Caused by: java.text.ParseException: Failed to parse date ["1534467411000']: Invalid time zone indicator '0'
at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274)
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:72)
... 19 more
Caused by: java.lang.IndexOutOfBoundsException: Invalid time zone indicator '6'
at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:245)
... 20 more
根据字面意思,是说time zone 时区符号 0 不合理(经过观察其他数据,发现排在第九位的0)
代码执行到这里,有一个time类型的字段,然后,gson的日期适配器出场
找到这个要反序列化的字段
(随机截图,不是文中举的例子) 从下面这个就可以看出,解析的有问题,显然这个感觉年月日都有问题
所以将,此时间戳拿到网上去看了下,
发现果然,不对 然后将单位转化为毫秒,如下
之后问了那边这个时间戳字段是毫秒的还是秒的,果然如上。
再看下为啥gson不解析到毫秒呢??
发现这个if语句为false,下面的逻辑便不执行了
为什么为false呢
第9位(index=8) 不等于 ‘T’,也就是没设置时区,那么we are done!
继续找时区
第9位是否是‘Z’,不是!
仍然不是!~
至此,出现了我们堆栈报错的最面上,也就是找不到时区的indicator。
换用jackson反序列化 为什么这个可以?
这个方法实现不同,而且有一个jsonToken 枚举类来控制逻辑。