Adding a custom Converter to Gson
suggest changeSometimes you need to serialize or deserialize some fields in a desired format, for example your backend may use the format “YYYY-MM-dd HH:mm” for dates and you want your POJOS to use the DateTime class in Joda Time.
In order to automatically convert these strings into DateTimes object, you can use a custom converter.
/** * Gson serialiser/deserialiser for converting Joda {@link DateTime} objects. */ public class DateTimeConverter implements JsonSerializer<DateTime>, JsonDeserializer<DateTime> { private final DateTimeFormatter dateTimeFormatter; @Inject public DateTimeConverter() { this.dateTimeFormatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm"); } @Override public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(dateTimeFormatter.print(src)); } @Override public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.getAsString() == null || json.getAsString().isEmpty()) { return null; } return dateTimeFormatter.parseDateTime(json.getAsString()); } }
To make Gson use the newly created converter you need to assign it when creating the Gson object:
DateTimeConverter dateTimeConverter = new DateTimeConverter(); Gson gson = new GsonBuilder().registerTypeAdapter(DateTime.class, dateTimeConverter) .create(); String s = gson.toJson(DateTime.now()); // this will show the date in the desired format
In order to deserialize the date in that format you only have to define a field in the DateTime format:
public class SomePojo { private DateTime someDate; }
When Gson encounters a field of type DateTime, it will call your converter in order to deserialize the field.
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents