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

Java Date 序列化為 JSON 顯示 [object Object] 解決

     編輯:程式設計綜合問答

問題現象

後台 java.util.Date 對象序列化為 JSON 後,前端顯示為 [object Object]。原始輸出格式類似 "Mon Sep 07 19:50:05 CST 2015",但經過 Controller 循環處理後變為對象結構,導致前端無法直接顯示。

根本原因

代碼中對 Date 進行了多次解析/格式化轉換,最終將 Date 對象直接放入 JSON 對象(JSONObject.fromObject(po)),導致序列化為嵌套對象(含 year、month、day 等屬性),而非字符串。前端 alert 或直接拼接時調用 toString() 得到 [object Object]。

解決方案

方案一:統一在服務端將 Date 格式化為字符串(推薦)

在 POJO/DTO 中對日期字段提供 String 類型的 getter,或使用 JSON 庫的日期格式化配置。

// 使用 Jackson (Spring Boot 默認)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;

// 或手動轉換
public String getCreateTimeStr() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createTime);
}

前端直接使用字符串,無需解析。

方案二:前端解析 Date 對象(若後端不可改)

若 JSON 結構為 {"year":115,"month":8,"date":7,"hours":19,"minutes":50,"seconds":5,...},前端手動拼裝:

function formatDate(obj) {
    // month 為 0-11
    return new Date(obj.year+1900, obj.month, obj.date, obj.hours, obj.minutes, obj.seconds)
           .toLocaleString();
}

方案三:配置 JSON 庫輸出長整型時間戳

// Jackson
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
// 輸出 1441626605000,前端 new Date(timestamp) 即可

代碼中的具體問題分析

Date createTime = po.getCreateTime();
DateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
String create = sdf.format(createTime);
Date dsdf = sdf.parse(create);          // 多此一舉:字符串→Date
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dft = df.format(dsdf);           // Date→字符串
Date dfs = df.parse(dft);               // 字符串→Date 再次!
po.setCreateTime(dfs);                  // 設置回 Date 對象
JSONObject json = data.fromObject(po);  // 序列化整個 PO,Date 變嵌套對象

多次解析/格式化屬於無效操作,最終仍存 Date 對象導致 JSON 嵌套。

最佳實踐總結

  1. 服務端輸出字符串:DTO 層定義 String 日期字段,或配置 @JsonFormat。
  2. 避免在 Controller 手動轉換 Date:交給序列化框架統一處理。
  3. 前端統一用字符串顯示:若需計算,再 new Date(str)。

按此調整後,JSON 將包含 "createTime":"2015-09-07 19:50:05",前端直接可用。

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