首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring MVC JSON 序列化 Date 變 Long 遞增解決方案:毫秒精度導致的自動轉換陷阱

     編輯:Java 綜合教學

Spring MVC JSON 序列化 Date 變 Long 遞增解決方案:毫秒精度導致的自動轉換陷阱

現象:後台查詢返回的 List 中 Date 字段顯示正常 (如 2016-03-17 15:42:11.0),但經 AJAX 請求後,前端收到的 JSON 卻變成了時間戳。斷點確認後台集合內容正常,問題出在 Jackson 序列化階段。

根因分析

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;

方案三:全局配置 ObjectMapper

@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 傾向於序列化為長整數時間戳。 統一格式化為秒級字串即可規避此行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved