带有 SimpleDateFormat 的 Gson 转换器

标签 gson simpledateformat

我正在运行一个代码,该代码使用具有简单日期格式功能的 Gson 转换器,有时日期格式会困惑,要么根据时区显示 1969-1970 年的日期,要么采用它并随机显示日期。

static class DateSerializer implements JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonElement jsonElement, Type typeOF, JsonDeserializationContext context)
            throws JsonParseException {
        for (SimpleDateFormat simpleDateFormat : DATE_FORMATS) {
            try {
                simpleDateFormat.setLenient(true);

                return simpleDateFormat.parse(jsonElement.getAsString());
            } catch (ParseException e) {
            }
        }
        return null;
    }
}
static {
    final TimeZone GMT_TIMEZONE = TimeZone.getTimeZone("GMT");
    int i = 0;
    for (String format : DATE_FORMAT_STRINGS) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.US);
        dateFormat.setTimeZone(GMT_TIMEZONE);
        DATE_FORMATS[i++] = dateFormat;
    }
}
Gson gson = new GsonBuilder()
            .registerTypeAdapter(Date.class, new DateSerializer())
            .create();
private static final String[] DATE_FORMAT_STRINGS = new String[]{"yyyy-MM-dd'T'HH:mm:ssZZZZ",
                                                                 "yyyy-MM-dd'T'HH:mm:ss'Z'"};

最佳答案

问题是 SimpleDateFormat is not thread-safe .您的反序列化发生在多个线程中以提高性能,但由于 SimpleDateFormat 的非线程安全性,您偶尔会在解析的日期中返回垃圾。

解决此问题的两个选项是在每次需要时创建一个新的 SimpleDateFormat,或者通过对日期格式创建锁定来强制执行原子性。

例如GSON的DefaultDateTypeAdapter采用后一种方法。

关于带有 SimpleDateFormat 的 Gson 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342698/

相关文章:

java - 消除 DateTimeFormat 和 Joda 的 DateTimeFormatter 之间细微的空白处理差异

java - 通过gson反序列化对象导致空指针异常

java - 将 JSON 插入 SQLite (GSON + Volley)

java - 解析异常 : Unparseable date in a custom method for parsing dates

Java 创建 PST 格式的日期返回 PDT 格式的日期

java - 简单日期格式解析日期时出错

java - 使用 springboot 创建具有 null 属性的对象的 Json 到 POJO

java - 使用不同关键字将 JSON 映射到 Java 对象

kotlin - 将枚举序列化为整数值

java - 无法解析具有简单日期格式的字符串