将自定义转换器添加到 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 类型的字段时,它将调用你的转换器以反序列化该字段。