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

如何将API返回的原始文本数据转换为JSON数组?

解析API层级键值响应为JSON数组的方法

问题场景

从API获取到特定格式的响应数据,需要转换为指定结构的JSON数组:

原始响应数据

found=100
items[0].Detail.Address=192.168.1.4
items[0].Detail.Type=CGI
items[0].Device=
items[0].Level=0
items[0].Time=2022-09-15 11:10:12
items[0].Type=Log In
items[0].User=admin
items[1].Detail.Address=192.168.1.4
items[1].Device=
items[1].Level=0
items[1].Time=2022-09-15 11:09:37
items[1].Type=Log Out
items[1].User=admin

期望输出的JSON数组

[
  {
    "Detail": {
      "Address": "192.168.1.4",
      "Type": "CGI"
    },
    "Device": "",
    "Level": 0,
    "Time": "2022-09-15 11:10:12",
    "Type": "Log In",
    "User": "admin"
  },
  {
    "Detail": {
      "Address": "192.168.1.4"
    },
    "Device": "",
    "Level": 0,
    "Time": "2022-09-15 11:09:37",
    "Type": "Log Out",
    "User": "admin"
  }
]

解决代码(JavaScript)

通过解析每行的键值对,逐层构建嵌套对象,最终整理为目标数组:

const rawData = `found=100
items[0].Detail.Address=192.168.1.4
items[0].Detail.Type=CGI
items[0].Device=
items[0].Level=0
items[0].Time=2022-09-15 11:10:12
items[0].Type=Log In
items[0].User=admin
items[1].Detail.Address=192.168.1.4
items[1].Device=
items[1].Level=0
items[1].Time=2022-09-15 11:09:37
items[1].Type=Log Out
items[1].User=admin`;

// 按行拆分并过滤空行
const lines = rawData.split('\n').filter(line => line.trim() !== '');
const temp = {};
const result = [];

lines.forEach(line => {
  // 拆分键和值,限制拆分次数避免值含等号的情况
  const [keyPart, value] = line.split('=', 2);
  // 把items[0]格式转为items.0,再按点拆分键段
  const keySegments = keyPart.replace(/\[(\d+)\]/, '.$1').split('.');
  
  if (keySegments[0] === 'items') {
    const index = parseInt(keySegments[1], 10);
    // 初始化当前索引的对象
    if (!temp[index]) temp[index] = {};
    let currentObj = temp[index];
    
    // 遍历键段,逐层构建嵌套结构
    for (let i = 2; i < keySegments.length; i++) {
      const segment = keySegments[i];
      if (i === keySegments.length - 1) {
        // Level字段转为数字,其他字段保留原值(空值转为空字符串)
        currentObj[segment] = segment === 'Level' ? parseInt(value, 10) : value || '';
      } else {
        if (!currentObj[segment]) currentObj[segment] = {};
        currentObj = currentObj[segment];
      }
    }
  }
});

// 按索引顺序整理为数组
Object.keys(temp).sort((a, b) => parseInt(a) - parseInt(b)).forEach(key => {
  result.push(temp[key]);
});

// 输出格式化后的JSON
console.log(JSON.stringify(result, null, 2));

代码逻辑说明

  1. 拆分与过滤:将原始文本按行拆分,过滤空行排除无效数据。
  2. 键段解析:把带索引的键(如items[0].Detail.Address)转换为点分隔格式后拆分,得到键的层级数组。
  3. 嵌套对象构建:根据键的层级逐层创建或访问对象,将值赋值到对应位置,同时将Level字段转为数字类型,空值统一处理为空字符串。
  4. 数组整理:将临时存储的对象按索引排序后,整理为符合要求的JSON数组。

内容的提问来源于stack exchange,提问作者developer-logs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:50:37