您的位置:首页 > 编程语言 > Java开发

Gson使用心得(一):Date的处理

2015-12-29 19:07 351 查看
首先,先介绍一下Gson。

这是Gson的GitHub主页:https://github.com/google/gson

Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson can work with arbitrary Java objects including pre-existing objects that you do not
have source-code of.

There are a few open-source projects that can convert Java objects to JSON. However, most of them require that you place Java annotations in your classes; something that you can not do if you do not have access to the source-code. Most also do not fully support
the use of Java Generics. Gson considers both of these as very important design goals.

Gson Goals

Provide simple toJson() and fromJson() methods to convert Java objects to JSON and vice-versa
Allow pre-existing unmodifiable objects to be converted to and from JSON
Extensive support of Java Generics
Allow custom representations for objects
Support arbitrarily complex objects (with deep inheritance hierarchies and extensive use of generic types)

简单来说,Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。

关于Gson的文章,网上已经茫茫多了,我就不再赘述。

今天要记录的是关于日期时间的处理。

以下是,通常我们使用Gson的方式。

import java.util.Date;

import com.google.gson.Gson;

public class DateGsonTest {

private String name;

private Date now;

public static void main(String[] args) {
DateGsonTest dgt = new DateGsonTest();

dgt.setName("Lance");
dgt.setNow(new Date());

Gson gson = new Gson();
String dgtStr = gson.toJson(dgt);
System.out.println("The json string of dgt:" + dgtStr);
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Date getNow() {
return now;
}

public void setNow(Date now) {
this.now = now;
}
}


第19行的打印输出为:The json string of dgt:{"name":"Lance","now":"Dec 29, 2015 4:35:43 PM"}

Date被序列化之后显示日期和时间的格式与locale环境有关。

当这样的Json在不同的locale环境中反序列化之后,几乎必然发生反序列化异常的问题。

所以,在不同的locale环境中,gson的序列化和反序列化必须明确约定日期时间格式。

具体做法如下:

package com.kxtech.goonie.common.util;
import java.lang.reflect.Type;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class UtilDateGSON implements JsonSerializer, JsonDeserializer {

private static final Log logger = LogFactory.getLog(UtilDateGSON.class);

@Override
public JsonElement serialize(Date arg0, Type arg1, JsonSerializationContext arg2) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new JsonPrimitive(sdf.format(arg0));
}

@Override
public Date deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(arg0.getAsJsonPrimitive().getAsString());
} catch (ParseException e) {
logger.error("UtilDateGSON deserialize error.", e);
}

return date;
}

}


编写自己的UtilDateGSON类,实现JsonSerializer和Deserializer两个接口中的两个方法。这样就明确约定了日期时间格式。

此时,gson对象不能再以new的方式创建实例,必须使用GsonBuilder类注册类型适配器并create gson对象。

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new UtilDateGSON()).create();


此时,第十九行的打印输出为:The json string of dgt:{"name":"Lance","now":"2015-12-29 17:05:36"}

OK,此坑已填。

最后,通常为我们会用Spring 来管理Bean,gson在spring的xml中可以通过factory-method的方式创建实例

package com.kxtech.goonie.common.util;

import java.util.Date;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class MyGsonFactory {

public static Gson buildGson() {
return new GsonBuilder().registerTypeAdapter(Date.class, new UtilDateGSON()).setDateFormat("yyyy-MM-dd HH:mm:ss").create();
}

}

<bean id="gson" class="com.kxtech.goonie.common.util.MyGsonFactory" factory-method="buildGson" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java gson