为Zabbix获取的JSON数组添加execTime字段时返回异常问题排查
问题分析与解决
问题根源
你看到[object Object],[object Object],...的原因是直接将JavaScript对象数组转为字符串时,默认调用的toString()方法会把每个对象输出为[object Object],而非你期望的JSON格式。另外,你的时间格式DD-MM-YYYY HH:mm:ss无法被JavaScript的Date构造函数直接正确解析,这也会导致时间差计算错误。
解决步骤与代码示例
1. 解析原始JSON字符串
首先要把Zabbix返回的JSON字符串解析为JavaScript对象数组,不能直接对字符串进行遍历操作。
2. 正确解析自定义时间格式
DD-MM-YYYY格式不被Date构造函数兼容,需要手动拆分日期部分,转换为YYYY-MM-DD格式后再解析。
3. 计算时间差并添加字段
遍历数组,为每个对象计算endTime与startTime的秒级差值,添加execTime字段。
4. 重新序列化为JSON字符串
处理完成后,必须将对象数组重新转为JSON字符串,而非直接输出数组。
完整代码:
// 假设从Zabbix获取的JSON字符串为jsonStr const jsonStr = '[{"startTime":"01-05-2024 10:00:00","endTime":"01-05-2024 10:00:30"},{"startTime":"02-05-2024 14:30:00","endTime":"02-05-2024 14:35:00"}]'; // 解析JSON字符串为对象数组 const data = JSON.parse(jsonStr); // 自定义时间解析函数:处理DD-MM-YYYY HH:mm:ss格式 function parseDate(dateStr) { const [datePart, timePart] = dateStr.split(' '); const [day, month, year] = datePart.split('-'); // 月份是0-based,需减1 return new Date(`${year}-${month}-${day}T${timePart}`); } // 处理每个对象,添加execTime字段 const processedData = data.map(item => { const startTime = parseDate(item.startTime); const endTime = parseDate(item.endTime); // 计算秒级时间差,取整 const execTime = Math.floor((endTime.getTime() - startTime.getTime()) / 1000); // 返回新对象,不修改原数据 return { ...item, execTime }; }); // 序列化为JSON字符串输出 const result = JSON.stringify(processedData); console.log(result);
常见错误排查
- 未解析JSON字符串:直接对原始字符串遍历,会导致操作的是字符串字符而非对象,引发错误。
- 时间解析错误:直接使用
new Date(item.startTime)会得到Invalid Date,导致时间差为NaN。 - 未序列化回JSON:处理后直接输出对象数组,数组的
toString()会输出[object Object]序列,而非JSON格式。 - 月份未减1:JavaScript的
Date对象月份是0-11(0代表1月),如果直接使用原始月份值会导致日期解析错误。
内容的提问来源于stack exchange,提问作者markfree
相关产品推荐
相关产品推荐

