今天在使用Gson的时候遇到无法转换时间戳的问题。

代码如下:

1
2
3
Gson gson = new Gson();
String jsonStr = "json字符串,省略。。";
Person person = gson.fromJson(jsonStr, Person.class);

报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
com.google.gson.JsonSyntaxException: /Date(1552348800000)/

at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:87)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:75)
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:46)
....
....
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.text.ParseException: Failed to parse date ["/Date(1552348800000)/"]: Invalid number: /Dat
at com.google.gson.internal.bind.util.ISO8601Utils.parse(ISO8601Utils.java:274)
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:85)
... 31 more
Caused by: java.lang.NumberFormatException: Invalid number: /Dat

后面查询接口给的数据才发现,Odata服务给的时间格式都是这种时间戳格式,所以Gson无法自动完成转换。

1
2
3
4
5
6
{        
"Person": "9980000020",
"PersonWorkAgreement": "50000000",
"PersonFullName": "Sarah Huang",
"CreateDate":"/Date(1552348800000)/"
}

经过一番摸索,解决方案如下:

给 Gson 注册一个处理时间戳的适配器,当字段为日期类型时会按时间戳处理。因此如果还有其它日期格式那就无法转换了!如:2019-06-17 12:00:01 这种格式,使用了这个适配器后就无法处理这种日期了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//创建GsonBuilder 管理收到的信息
GsonBuilder builder = new GsonBuilder();
//注册适配器以将日期类型作为长值进行管理
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
String dateStr = json.getAsJsonPrimitive().getAsString();
long timestamp = Long.parseLong(dateStr.substring(6, dateStr.length() - 2));
Date d = new Date(timestamp);
return d;
}
});
Gson gson = builder.create();
String jsonStr = "json字符串,省略。。";
Person person = gson.fromJson(jsonStr, Person.class);

更改后反序列化成功。

转换出来的时间格式如下:

1
Person(person=9980000020, personWorkAgreement=50000000, personFullName=Sarah Huang, createDate=Tue Mar 12 08:00:00 GMT+08:00 2019)