程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

java(0)

标签  

暂无标签

日期归档  

Gson报错Invalid time zone indicator ‘ ‘

发布于2020-11-19 20:27     阅读(1506)     评论(0)     点赞(10)     收藏(0)


1.问题描述

今天在用Gson进行反序列化json为java bean时,报Invalid time zone indicator ' '。详细报错日志如下:

  1. Caused by: com.google.gson.JsonSyntaxException: 1534467411000
  2. at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:74)
  3. at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:59)
  4. at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41)
  5. at com.google.gson.internal.bind.TypeAdapters$26$1.read(TypeAdapters.java:598)
  6. at com.google.gson.internal.bind.TypeAdapters$26$1.read(TypeAdapters.java:596)
  7. at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)
  8. at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
  9. at com.google.gson.Gson.fromJson(Gson.java:887)
  10. at com.google.gson.Gson.fromJson(Gson.java:852)
  11. at com.google.gson.Gson.fromJson(Gson.java:801)
  12. at com.google.gson.Gson.fromJson(Gson.java:773)
  13. Caused by: java.text.ParseException: Failed to parse date ["1534467411000']: Invalid time zone indicator '0'
  14. at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274)
  15. at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:72)
  16. ... 19 more
  17. Caused by: java.lang.IndexOutOfBoundsException: Invalid time zone indicator '6'
  18. at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:245)
  19. ... 20 more

实际上是因为Gson反序列化时间long值转为Date类型报错,即Gson无法解析位数太长的时间格式。这个详细分析可参看:https://blog.csdn.net/uniquewonderq/article/details/103037400

2.解决步骤

(1)解决方法1

这个报错解决方案在Gson上有相关的issue,可参看https://github.com/google/gson/issues/1297。即不使用 new Gson() 创建对象,并指定dateFormat类型。

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create()

(2)解决方法2

实际发现这种方式也有可能不能解决该报错。推荐使用下面的方式,采用GsonBuilder 注册Date类型。

  1. GsonBuilder builder = new GsonBuilder();
  2. builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
  3. public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
  4. return new Date(json.getAsJsonPrimitive().getAsLong());
  5. }
  6. });
  7. Gson gson = builder.create();

分析过程可参看:https://stackoverflow.com/questions/41958062/convert-string-date-to-object-yields-invalid-time-zone-indicator-0

大家可根据实际情况选择两种解决方法。

原文链接:https://blog.csdn.net/znb769525443/article/details/109751708



所属网站分类: 技术文章 > 博客

作者:java王侯

链接:http://www.javaheidong.com/blog/article/894/5a9b7fb53ed96955b6df/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)