將自定義轉換器新增到 Gson

有時你需要以所需格式序列化或反序列化某些欄位,例如,你的後端可能會使用格式“YYYY-MM-dd HH:mm”作為日期,並且你希望 POJOS 在 Joda Time 中使用 DateTime 類。

為了自動將這些字串轉換為 DateTimes 物件,你可以使用自定義轉換器。

/**
 * 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());
    }
}

要使 Gson 使用新建立的轉換器,你需要在建立 Gson 物件時分配它:

    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

要以該格式反序列化日期,你只需要以 DateTime 格式定義欄位:

public class SomePojo {
    private DateTime someDate;    
} 

當 Gson 遇到 DateTime 型別的欄位時,它將呼叫你的轉換器以反序列化該欄位。