当前位置: 首页 > 面试题库 >

gson无法使用GsonBuilder.setDateFormat(“ yyyy-MM-dd'T'HH:mm:ss.SSSZ”)进行解析

林英朗
2023-03-14
问题内容

我从服务器获取以下字符串:

[
 {
  "title":"spoil the ones u love today",
  "startDateTime":"2014-08-10T20:10:36.7158Z"
 },
 {
  "title":"home made patisserie",
  "startDateTime":"2014-08-10T20:08:45.0218Z"
 }
]

我尝试将其解析为一个对象

    public class Offer implements Serializable {
        public String title;
        public Date startDateTime;
    }

Type collectionType = new TypeToken<ArrayList<Offer>>() {}.getType();

mOffersList.addAll((Collection<? extends Offer>) gson.fromJson(result, collectionType));

但是当我定义“ startDate”作为日期时

我从gson回来的收藏集是空的

当我将“ startDate”定义为字符串时

集合已正确填充。

我想更改其日期格式。这就是为什么我更喜欢将其保存为Date对象。

我努力了

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

但是Gson无法将服务器的字符串解析为

Date startDateTime。没有添加任何内容,mOffersList并且保持空白。

我究竟做错了什么?


问题答案:

仅设置所需的DateFormat是不够的。

您需要定义 com.google.gson.JsonDeserializer 的实现。对于前。

import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

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.SSS'Z'");
      format.setTimeZone(TimeZone.getTimeZone("GMT"));

      try {
          return format.parse(date);
      } catch (ParseException exp) {
          System.err.println("Failed to parse Date:", exp);
          return null;
      }
   }
}

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

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


 类似资料:
  • 问题内容: 如果能找到有关此异常的错误的帮助,我将不胜感激: 和以下代码: 它用引发异常。 ,作为例外。 谢谢。 问题答案: 代表时区字符。需要引用:

  • 问题内容: 我正在尝试将yyyy-MM-dd’T’HH:mm:ss.SSSz格式的日期格式化为yyyy-mm-dd HH:mm:ss,这应该很简单,但我无法正常工作。 必须解析的日期的格式为:2012-10-01T09:45:00.000 + 02:00 现在,我使用此简单的日期格式化程序对其进行格式化: 但这给出的输出类似于2012-10-01T09:45:00.000UTC + 00:00。

  • 问题内容: 有人可以让我知道吗,如何在Java 中将日期格式转换为日期, 在输入和输出日期中都应为Strings。 我用过apache,但是在输出中没有毫秒数。 问题答案: 您还可以在Java 8中使用更新的Time API ,类似… 哪个输出… 这使您对管理时区负有更多责任,通常这可能是一个更好的解决方案 而且因为在Java 8 API中的时区之间进行转换使我很头疼(缺乏经验:P) 哪个输出…

  • 问题内容: 我正在获取以下代码 如果我注释掉该行,那么我会在输出中看到时差 我究竟做错了什么?? 问题答案: “ S”为毫秒。每秒有1000毫秒(0到999)。389362大于999。多余的389000毫秒将转换为389秒或6分29秒,并添加到时间中。

  • 问题内容: 我正在尝试解析以下日期时间字符串 2018-01-30T23:59:59.000 我无法理解它是哪种标准格式,例如UTC或ISO_8601 同时以以下方式进行解析: 但是它抛出以下异常: 任何帮助表示赞赏。 问题答案: 打印: 2018-01-30T23:59:59 您的字符串为ISO 8601格式。UTC或协调世界时不是一种格式,它是一种标准时间,用于定义我们各自时区中其余时间的使用

  • 问题内容: 我正在使用Java 8和Gson的最新版本(通过Maven)。如果我序列化一个,我会得到这样的东西 我本来喜欢的地方。Gson是否还支持开箱即用的更简洁格式,还是我必须为s 实现自定义序列化程序? (我已经尝试过了,但这似乎没有什么不同。) 问题答案: 直到另行通知,我已经实现了一个自定义序列化器,如下所示: 它可以像这样安装: