首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将GSON序列化日期从json字符串转换为java.util.date

将GSON序列化日期从json字符串转换为java.util.date
EN

Stack Overflow用户
提问于 2013-08-28 02:36:04
回答 7查看 83K关注 0票数 87

我正在使用Retrofit库进行REST调用。我所做的大部分工作都非常顺利,但是由于某些原因,我在将JSON时间戳字符串转换为java.util.Date对象时遇到了问题。即将出现的JSON如下所示。

代码语言:javascript
复制
{
    "date": "2013-07-16",
    "created_at": "2013-07-16T22:52:36Z",
} 

如何告诉Retrofit或Gson将这些字符串转换为java.util.Date objects

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-05-24 18:24:15

代码语言:javascript
复制
Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
    .create();

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(API_BASE_URL)
    .setConverter(new GsonConverter.create(gson))
    .build();

或者Kotlin的等价物:

代码语言:javascript
复制
val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create()
RestAdapter restAdapter = Retrofit.Builder()
    .baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build()
    .create(T::class.java)

您可以将自定义的Gson解析器设置为改进。更多信息请点击这里:Retrofit Website

看看Ondreju的回应,看看如何在retrofit 2中实现这一点。

票数 181
EN

Stack Overflow用户

发布于 2016-01-25 08:39:39

@gderaco的答案更新为retrofit 2.0:

代码语言:javascript
复制
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss")
.create();

Retrofit retrofitAdapter = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
票数 90
EN

Stack Overflow用户

发布于 2014-07-05 17:22:13

下面是我是如何做到的:

创建扩展Date的DateTime类,然后编写自定义的反序列化程序:

代码语言:javascript
复制
public class DateTime extends java.util.Date {

    public DateTime(long readLong) {
        super(readLong);
    }

    public DateTime(Date date) {
        super(date.getTime());
    }       
}

现在对于反序列化部分,我们注册了Date和DateTime转换器:

代码语言:javascript
复制
public static Gson gsonWithDate(){
    final GsonBuilder builder = new GsonBuilder();

    builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {  

        final DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
        @Override  
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {  
            try {  
                return df.parse(json.getAsString());  
            } catch (final java.text.ParseException e) {  
                e.printStackTrace();  
                return null;  
            }  
        }
    });

    builder.registerTypeAdapter(DateTime.class, new JsonDeserializer<DateTime>() {  

        final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        @Override  
        public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {  
            try {  
                return new DateTime(df.parse(json.getAsString()));  
            } catch (final java.text.ParseException e) {
                e.printStackTrace();  
                return null;  
            }  
        }
    });

    return builder.create();
}

在创建RestAdapter时,请执行以下操作:

代码语言:javascript
复制
new RestAdapter.Builder().setConverter(gsonWithDate());

你的Foo应该是这样的:

代码语言:javascript
复制
class Foo {
    Date date;
    DateTime created_at;
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18473011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档