我具有以下实体列定义:
@Column(name= "time")
@Temporal(TemporalType.TIMESTAMP)
private java.util.Calendar time;
当我查询并以JSON格式返回数据时
modules = this.moduleStatsRepository.findAll();
JsonArray modulesArray = Application.gson.fromJson(Application.gson.toJson(modules), JsonArray.class);
JsonObject modulesJson = new JsonObject();
modulesJson.add("modules", modulesArray);
modulesJson.addProperty("triggerTimeShortSec", configurationManager.startupConfig.get("stats_trigger_time_sec"));
modulesJson.addProperty("triggerTimeLongSec", Integer.parseInt(configurationManager.startupConfig.get("stats_trigger_time_sec")) * 3);
return Application.gson.toJson(modulesJson);
时间作为一个对象返回,不是很理想:
是否可以自定义gson设置以将日期解析为ISO 8601?
答案 0 :(得分:2)
其中许多事情都是杰克逊开箱即用的。使用Gson似乎没有配置ISO 8601时间戳的选项,因此您必须自己注册一个JsonSerializer<Calendar>
,也许还要注册一个JsonDeserializer<Calendar>
来编写它。
例如,一个简化的ISO 8601字符串到日历转换器可能看起来像这样:
public class CalendarISO8601Serializer implements JsonSerializer<Calendar>, JsonDeserializer<Calendar> {
private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
@Override
public Calendar deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
try {
Calendar instance = Calendar.getInstance();
instance.setTime(FORMATTER.parse(jsonElement.getAsString()));
return instance;
} catch (ParseException e) {
throw new JsonParseException(e);
}
}
@Override
public JsonElement serialize(Calendar calendar, Type type, JsonSerializationContext jsonSerializationContext) {
return new JsonPrimitive(FORMATTER.format(calendar.getTime()));
}
}
这意味着您不能再依赖Spring引导创建的默认Gson
对象,因为我认为它不会自动将串行器用作类型适配器。为了解决这个问题,您需要创建自己的Gson
bean并添加序列化器:
@Bean
public Gson gson() {
return new GsonBuilder()
.registerTypeHierarchyAdapter(Calendar.class, new CalendarISO8601Serializer())
.create();
}
但是考虑到您使用的是公共静态字段(Application.gson
),您可能想亲自看看如何注册该适配器。
答案 1 :(得分:0)
只需在您的实体中使用java.util.Date作为类型:
@Temporal(TemporalType.TIMESTAMP)
private Date date;