我正在使用 Gson 序列化/反序列化我的 pojo,目前正在寻找一种干净的方法来告诉 Gson 将日期属性解析/输出为 unix 时间戳。 这是我的尝试:
Gson gson = new GsonBuilder().setDateFormat("U").create();
来自 PHP,其中“U”是用于将日期序列化/反序列化为 unix 时间戳的日期格式,当运行我的尝试代码时,我是一个
RuntimeException
:
未知模式字符“U”
我假设 Gson 在底层使用了
SimpleDateformat
,它没有定义字母“U”。
我可以实现自定义
DateTypeAdapter
,但我正在寻找一种更干净的方法来实现这一目标。只需更改 DateFormat
就很好了。
TL;DR:使用以下要点UnixTimestampAdapter.java
创建自定义
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 - 如果您想在所有日期字段上应用此序列化,请在创建
UnixTimestampAdapter
实例时注册 Gson
:
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new UnixTimestampAdapter())
.create();
2 - 如果您希望它仅应用于某些特定字段,则可以使用
@JsonAdapter
注释您的日期字段(如 @Marcono1234 建议)。
class Person {
@JsonAdapter(UnixTimestampAdapter.class)
private Date birthday;
}
时间戳只是
long
,因此您可以在 POJO 中使用它。 或者,如果该字段缺失,请使用 Long
获取 null
。
class myPOJO {
Long myDate;
}