Failed to parse date ["1534467411000"]:Invalid time zone indicator '0'

时间:2022-07-25
本文章向大家介绍Failed to parse date ["1534467411000"]:Invalid time zone indicator '0',主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景

使用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 枚举类来控制逻辑。