如何自动将含字符串日期的JSON响应转换为JS日期(多字段多类)
无需手动遍历JSON响应,自动转换日期字符串为JS Date(基于date-fns)
当然可以不用每次请求都手动遍历JSON响应修改对象,结合date-fns库能轻松实现日期字符串到JS Date对象的自动转换,下面给你两种实用方案:
一、通用日期转换函数(适用于任意JSON结构)
可以封装一个通用函数,传入JSON响应和需要转换的日期字段列表,函数会递归处理对象/数组,自动把指定字段的字符串转成Date对象:
import { parseISO } from 'date-fns'; function convertDates(obj, dateFields) { // 非对象直接返回 if (!obj || typeof obj !== 'object') return obj; // 数组则递归处理每个元素 if (Array.isArray(obj)) { return obj.map(item => convertDates(item, dateFields)); } // 复制原对象避免修改源数据 const processedObj = { ...obj }; // 转换指定日期字段 dateFields.forEach(field => { if (processedObj[field]) { // 服务器返回ISO格式日期时用parseISO,其他格式用parse(见下方说明) processedObj[field] = parseISO(processedObj[field]); } }); // 递归处理嵌套对象 Object.keys(processedObj).forEach(key => { const value = processedObj[key]; if (typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) { processedObj[key] = convertDates(value, dateFields); } }); return processedObj; }
使用示例
// 假设请求返回的JSON数据 const apiResponse = await fetch('/api/orders').then(res => res.json()); // 指定需要转换的日期字段 const targetDateFields = ['createTime', 'payTime', 'deliveryTime']; // 自动转换日期 const dataWithDates = convertDates(apiResponse, targetDateFields);
如果服务器返回的是非ISO格式的日期字符串(比如YYYY-MM-DD HH:mm:ss),可以替换成date-fns的parse方法:
import { parse } from 'date-fns'; // 在convertDates函数里替换对应行 processedObj[field] = parse(processedObj[field], 'yyyy-MM-dd HH:mm:ss', new Date());
二、结合类的静态方法(适用于结构化数据)
如果你的数据对应明确的类(比如用户、订单),可以在类里定义fromJSON静态方法,专门处理JSON到类实例的转换,同时自动转换日期字段:
import { parseISO } from 'date-fns'; class Order { constructor(id, orderNo, createTime, totalAmount) { this.id = id; this.orderNo = orderNo; this.createTime = createTime; // 已转换为Date对象 this.totalAmount = totalAmount; } // 静态方法:从JSON生成类实例 static fromJSON(json) { const createTime = parseISO(json.createTime); return new Order(json.id, json.orderNo, createTime, json.totalAmount); } }
使用示例
const orderJson = await fetch('/api/orders/123').then(res => res.json()); const order = Order.fromJSON(orderJson); // order.createTime 已经是Date对象
这两种方案都不用每次请求手动遍历对象,只需提前定义好转换规则,请求后调用对应方法即可完成日期转换。
内容的提问来源于stack exchange,提问作者Adam chan
相关产品推荐
相关产品推荐

