java - 用于序列化/反序列化 unix 时间戳的 Gson 日期格式

标签 java android gson date-format unix-timestamp

我正在使用 Gson 序列化/反序列化我的 pojo,目前正在寻找一种干净的方法来告诉 Gson 将日期属性解析/输出为 unix 时间戳。 这是我的尝试:

Gson gson = new GsonBuilder().setDateFormat("U").create();

来自 PHP,其中“U”是用于将日期序列化/反序列化为 unix 时间戳的日期格式,当运行我的尝试代码时,我是一个 RuntimeException:

Unknown pattern character 'U'

我假设 Gson 在未定义字母“U”的情况下使用 SimpleDateformat

我可以实现自定义 DateTypeAdapter,但我正在寻找一种更简洁的方法来实现它。只需更改 DateFormat 即可。

最佳答案

创建自定义 TypeAdapter (UnixTimestampAdapter) 是可行的方法。

UnixTimestampAdapter

public class UnixTimestampAdapter extends TypeAdapter<Date> {

    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        out.value(value.getTime() / 1000);
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        if (in.peek() == JsonToken.NULL) {
            in.nextNull();
            return null;
        }
        return new Date(in.nextLong() * 1000);
    }

}

现在,您必须选择(取决于您的用例):

1 - 如果您想在所有日期字段上应用此序列化,则在创建 Gson 实例时注册 UnixTimestampAdapter:

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

2 - 如果您希望它仅应用于某些特定字段,或者使用 @JsonAdapter 注释您的日期字段(如 @Marcono1234 所建议)。

class Person {
    @JsonAdapter(UnixTimestampAdapter.class)
    private Date birthday;
}

关于java - 用于序列化/反序列化 unix 时间戳的 Gson 日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41348055/

相关文章:

android - 增大音量时,Android x86 Audio崩溃

java - 按后退箭头时会调用 onResume() 。请查看详情

java - 不为空值调用 Gson 自定义解串器

java - JSON - 使用 Gson 反序列化客户端类

java - 使用 MathContext 调用时,BigDecimal.divide() 会产生额外的精度数字

java - JSTL:在自定义标签中使用 scriptlet

java - 你如何计算具有初始高度的弹丸的位移?

java - 如何方便 Netbeans Designer 加载使用 hashmap 进行枚举反向查找的 JPanel?

android - 添加依赖项时出错 - Android Studio

java - 删除android中json中的重复字段