小编典典

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

json

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

[
 {
  "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并且保持空白。

我究竟做错了什么?


阅读 967

收藏
2020-07-27

共1个答案

小编典典

仅设置所需的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());
2020-07-27