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

but5z9lq  于 2022-11-06  发布在  Unix
关注(0)|答案(2)|浏览(198)

我正在使用Gson对我的pojos进行序列化/反序列化,目前正在寻找一种简洁的方法来告诉Gson将日期属性解析/输出为Unix时间戳。

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

来自PHP,其中“U”是用于将日期序列化/反序列化为Unix时间戳的日期格式,当运行我的尝试代码时,我是RuntimeException
未知的模式字符'U'
我假设Gson在引擎盖下使用SimpleDateformat,这并没有定义字母“U”。
我可以实现一个自定义的DateTypeAdapter,但我正在寻找一个更干净的方法来实现它。简单地改变DateFormat将是伟大的。

bwntbbo3

bwntbbo31#

创建一个自定义的TypeAdapterUnixTimestampAdapter)是可行的方法。

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应用于某些特定字段,请使用@JsonAdapter(如@Marcono1234所建议的)对日期字段进行注解。

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

kxe2p93d2#

时间戳只是long的,所以你可以在你的POJO中使用它。或者如果字段丢失了,使用Long来获得null

class myPOJO {
    Long myDate;
}

相关问题