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

Ela*_*da2 7 java json date simpledateformat gson

我从服务器获取此字符串:

[
 {
  "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"
 }
]
Run Code Online (Sandbox Code Playgroud)

我试着解析它一个对象

    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));
Run Code Online (Sandbox Code Playgroud)

但是当我将"startDate"定义为Date时

我从gson回来的系列是空的

当我将"startDate"定义为String时

集合正确填充.

我想更改其日期格式.这就是我喜欢将它保存为Date对象的原因.

我试过了

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

然而Gson无法解析服务器的字符串

Date startDateTime.没有添加任何东西mOffersList,它保持空白.

我究竟做错了什么?

Vai*_*Raj 17

仅设置所需的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;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

然后注册上面的解串器:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
Run Code Online (Sandbox Code Playgroud)

  • 为什么gsonBuilder存在`setDateFormat()`?不是作为琐碎的必要条件的捷径? (5认同)
  • 但是gson将如何知道何时解析date-json? (2认同)