Gson无法在java中解析我的json日期

时间:2017-03-20 16:21:45

标签: java json date gson

我试图对使用rest的java-ee应用程序进行一些测试,但是当我尝试使用gson格式化一些json时,我收到了以下错误:

java.text.ParseException: Failed to parse date ["1489752692000']: Invalid time zone indicator '9'

当我用Gson gson = new Gson();初始化我的Gson时发生了这种情况,我在StackOverflow上找到了this question,其中解决方案是创建一个自定义的DateDeseriliazer类并且像这样初始化:

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

这是我的DateDeserializer类的版本:

public class GsonDateFormatter implements JsonDeserializer<Date> {

    private final DateFormat dateFormat;

    public GsonDateFormatter() {
        dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        dateFormat.setTimeZone(TimeZone.getTimeZone("CET"));
    }

    public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) {
        try {
            return dateFormat.parse(jsonElement.getAsString());
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }
}

但这只会将错误消息更改为:

java.text.ParseException: Unparseable date: "1489752692000"

所以我现在不太确定如何解决这个问题,我希望有人可以帮助我。

提前致谢。

1 个答案:

答案 0 :(得分:2)

你有自纪元以来似乎毫秒的东西。

建议使用java.time API now in Java 8代替SimpleDateFormat

import java.time.Instant;
import java.time.ZonedDateTime;
import java.timeZoneOffset;

// ... 

long epoch = Long.parseLong(jsonElement.getAsString()); // Or if you can do jsonElement.getAsLong()
Instant instant = Instant.ofEpochMilli(epoch);
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); // 2017-03-17T12:11:32Z

但是,无论如何,您不需要SimpleDateFormat从长值返回Date

public synchronized Date deserialize(JsonElement jsonElement,Type type,JsonDeserializationContext jsonDeserializationContext) {
    long epoch = jsonElement.getAsLong();
    return new Date(epoch);
 }