I am using Gson to serialize/deserialize my pojos and currently looking for a clean way to tell Gson to parse/output date attributes as unix-timestamps. Here’s my attempt:
Gson gson = new GsonBuilder().setDateFormat("U").create();
Comming from PHP where “U” is the dateformat used to serialize/deserialize date as unix-timestamps, when running my attempt code, I am a RuntimeException
:
Unknown pattern character ‘U’
I am assuming that Gson uses SimpleDateformat
under the hood which doesn’t define the letter “U”.
I could implement a custom DateTypeAdapter
but I am looking for a cleaner way to achieve that. Simply changing the DateFormat
would be great.
Advertisement
Answer
Creating a custom TypeAdapter
(UnixTimestampAdapter
) was the way to go.
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); } }
Now, you have to options (depending on your use case):
1 – If you want apply this serialization on all your date fields then register UnixTimestampAdapter
upon creating your Gson
instance:
Gson gson = new GsonBuilder() .registerTypeAdapter(Date.class, new UnixTimestampAdapter()) .create();
2 – Or annotate your date fields with @JsonAdapter
(as suggested by @Marcono1234) if you want it applied only to some specific fields.
class Person { @JsonAdapter(UnixTimestampAdapter.class) private Date birthday; }