【问题标题】:Gson java.lang.IllegalArgumentException: No time zone indicatorGson java.lang.IllegalArgumentException:没有时区指示符
【发布时间】:2018-08-16 17:12:20
【问题描述】:

我在使用 Gson 时遇到了奇怪的错误。

我是这样创建的

mGson = new GsonBuilder().registerTypeAdapter(beelineItemType, new ItemsDeserializer()).setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();

而我的json对象是这样的:

"EpgStartDate" : "2018-08-16T18:00:00" 

但是当我尝试反序列化它时,我得到了这个错误:

ccom.google.gson.JsonSyntaxException: 2018-08-16T06:00:00

caused by: java.text.ParseException: Failed to parse date ["2018-08-16T06:00:00']: No time zone indicator (at offset 0)

Caused by: java.lang.IllegalArgumentException: No time zone indicator

我不明白将时区放在哪里以及如何放置。我在塞尔维亚,所以在哪里,如何以及什么时区。如果有人可以提供帮助,那就太好了:D

【问题讨论】:

  • 对于塞尔维亚,您需要欧洲/贝尔格莱德的时区,例如 ZoneId.of("Europe/Belgrade")。我不知道 GSON,也不能告诉你把它放在哪里。

标签: java android timezone gson datetime-parsing


【解决方案1】:

你应该像这样制作反序列化器

public class DateDeserializer implements JsonDeserializer<Date> {

  @Override
  public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
      String date = element.getAsString();

      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
      format.setTimeZone(TimeZone.getTimeZone("GMT"));

      try {
          return format.parse(date);
      } catch (ParseException exp) {
          System.err.println(exp.getMessage());
          return null;
      }
   }
}

然后注册上面的反序列化器:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());

【讨论】:

  • 请不要教年轻人使用早已过时且臭名昭著的麻烦SimpleDateFormat类。至少不是第一选择。而且不是没有任何保留。今天我们在java.time, the modern Java date and time API 和它的DateTimeFormatter 中有很多更好的东西。是的,您可以在 Android 上使用它。对于较旧的 Android,请参阅 How to use ThreeTenABP in Android Project
  • 这工作得很好,但我必须 gson 对象,而我发布的设置日期格式的不是反序列化的:D 所以我只是在正确的 gson 对象上添加设置日期格式效果很好
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多