Spring Boot-响应日期格式不正确

时间:2018-07-04 08:52:53

标签: spring-boot gson

我具有以下实体列定义:

@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);

时间作为一个对象返回,不是很理想:

enter image description here

是否可以自定义gson设置以将日期解析为ISO 8601

2 个答案:

答案 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;