現象:後台查詢返回的 List
Jackson 默認將 java.util.Date 序列化為數字時間戳。但本案例中,Date 字符串包含 毫秒部分 .0 (即 2016-03-17 15:42:11.0),導致 Jackson 誤判為帶毫秒精度的日期,進而選擇長整數輸出格式。
在返回前統一格式化 Date 字段,去除毫秒部分:
private List<Map<String, Object>> formatDate(List<Map<String, Object>> list) {
List<Map<String, Object>> result = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (Map<String, Object> map : list) {
if (map.get("add_time") != null) {
String raw = map.get("add_time").toString();
try {
Date date = sdf.parse(raw); // 解析原字串
map.put("add_time", sdf.format(date)); // 重新格式化為無毫秒字串
} catch (ParseException e) {
e.printStackTrace();
}
}
result.add(map);
}
return result;
}
格式化後,Jackson 將其視為普通字串直接輸出,不再轉為時間戳。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date addTime;
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return mapper;
}
應用方案一後,前端 JSON 正常顯示:"add_time": "2016-03-17 15:42:11",問題徹底解決。
Date.toString() 輸出包含毫秒 (.0) 時,Jackson 傾向於序列化為長整數時間戳。 統一格式化為秒級字串即可規避此行為。