後台 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]。
在 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);
}
前端直接使用字符串,無需解析。
若 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();
}
// 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 嵌套。
String 日期字段,或配置 @JsonFormat。new Date(str)。按此調整後,JSON 將包含 "createTime":"2015-09-07 19:50:05",前端直接可用。