【问题标题】:Spring boot - date in response is not well formattedSpring Boot - 响应日期格式不正确
【发布时间】:2018-07-04 08:52:53
【问题描述】:

我有以下实体列定义:

@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

【问题讨论】:

  • 试试@JsonFormat。像这样@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd@HH:mm:ss.SSSZ")
  • 添加了它,仍然返回相同的日期对象

标签: spring-boot gson


【解决方案1】:

杰克逊的许多事情都是开箱即用的。使用 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 boot 创建的默认 Gson 对象,因为我认为它不会自动将序列化程序作为类型适配器。要解决这个问题,您需要创建自己的Gson bean 并添加序列化程序:

@Bean
public Gson gson() {
    return new GsonBuilder()
        .registerTypeHierarchyAdapter(Calendar.class, new CalendarISO8601Serializer())
        .create();
}

但考虑到您使用的是公共静态字段 (Application.gson),您可能希望自己了解如何注册该适配器。

【讨论】:

    【解决方案2】:

    只需在您的实体中使用 java.util.Date 作为类型:

     @Temporal(TemporalType.TIMESTAMP)
    private Date date;
    

    【讨论】:

    • 我得到了同样的回应
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多