You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:43:28