gson无法使用GsonBuilder.setDateFormat解析(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”) [英] gson fails to parse using GsonBuilder.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")

查看:1942
本文介绍了gson无法使用GsonBuilder.setDateFormat解析(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从服务器获取这个字符串:

  [
{
title:破坏你今天爱的人,
startDateTime:2014-08-10T20:10:3​​6.7158Z
},
{
title:home made patisserie,
startDateTime:2014-08-10T20:08:45.0218Z
}
]

,我尝试解析它的一个对象

  public class Offer implements Serializable { 
public String title;
public日期startDateTime;
}

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

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

但是当我将startDate定义为日期时


$ b $当我将startDate定义为一个字符串时



p>集合填写正确。



我想更改其日期格式。这就是为什么我更喜欢将它保存为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实现JsonDeserializer< Date> {

@覆盖
公开日期反序列化(JsonElement元件,类型ARG1,JsonDeserializationContext ARG2)抛出JsonParseException {
字符串日期= element.getAsString();

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

尝试{
return format.parse(date);
} catch(ParseException exp){
System.err.println(Failed to parse Date:,exp);
返回null;
}
}
}

然后注册上述解串器:

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


I get this string from the server:

[
 {
  "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"
 }
]

and I try to parse it an object

    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));

but when I define "startDate" as a Date

the collection I get back from gson is empty

When i define "startDate" as a String

the collection is filled correctly.

I want to change its date format. That's why I prefer saving it as a Date object.

I have tried

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

and yet Gson fails to parse the server's string into

Date startDateTime. Nothing is added to the mOffersList and it stays empty.

What am I doing wrong?

解决方案

Only setting the required DateFormat is not sufficient.

You need to define an implementation of com.google.gson.JsonDeserializer. For ex.

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;
      }
   }
}

and then register the above deserializer:

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

这篇关于gson无法使用GsonBuilder.setDateFormat解析(“yyyy-MM-dd'T'HH:mm:ss.SSSZ”)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆