【发布时间】:2015-01-05 21:52:30
【问题描述】:
我有一些实体,其中包含一些日历属性。我想以将它们存储为 GSON 序列化 JSON 中的日期的方式对其进行序列化,因为 Mongo 可以将 $date 存储为 new ISODate("..")。我们通常通过使用 ExclusionStrategy 忽略日历属性并手动设置它们来做到这一点,但一段时间后它变得非常可怕。
我发现了一些代码 sn-ps 应该可以通过自定义 TypeAdapter 使其工作。
这是我的 CalendarDateTypeAdapter。
public class CalendarDateTypeAdapter extends TypeAdapter<Calendar> implements JsonSerializer<Calendar>, JsonDeserializer<Calendar> {
private static final Gson gson = new GsonBuilder().create();
private static final TypeAdapter<Date> dateTypeAdapter = gson.getAdapter(Date.class);
private static final String MONGO_UTC_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public JsonElement serialize(Calendar src, Type type,
JsonSerializationContext context) {
if (src == null) {
return null;
} else {
SimpleDateFormat format = new SimpleDateFormat(MONGO_UTC_FORMAT);
JsonObject jo = new JsonObject();
jo.addProperty("$date", format.format(src.getTime()));
return jo;
}
}
@Override
public Calendar deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
Date date = null;
SimpleDateFormat format = new SimpleDateFormat(MONGO_UTC_FORMAT);
try {
date = format.parse(json.getAsJsonObject().get("$date").getAsString());
} catch (ParseException e) {
date = null;
}
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
return gregorianCalendar;
}
@Override
public void write(JsonWriter out, Calendar value) throws IOException {
dateTypeAdapter.write(out, value.getTime());
}
@Override
public Calendar read(JsonReader in) throws IOException {
Date read = dateTypeAdapter.read(in);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(read);
return gregorianCalendar;
}
}
当我创建我的 gson 时:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(GregorianCalendar.class, new CalendarDateTypeAdapter());
Gson create = gsonBuilder.create();
并尝试连载我得到类似的东西:
{ "dateHarvested" : { "year" : 2015 , "month" : 0 , "dayOfMonth" : 5 , "hourOfDay" : 22 , "minute" : 45 , "second" : 37}
代替:
"date_harvested" : ISODate("2015-01-05T13:03:56.132Z")
之后在反序列化时,我希望将其转换回公历。
我做错了什么?
【问题讨论】:
标签: json mongodb serialization calendar gson