如何将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));
代码逻辑说明
- 拆分与过滤:将原始文本按行拆分,过滤空行排除无效数据。
- 键段解析:把带索引的键(如
items[0].Detail.Address)转换为点分隔格式后拆分,得到键的层级数组。 - 嵌套对象构建:根据键的层级逐层创建或访问对象,将值赋值到对应位置,同时将
Level字段转为数字类型,空值统一处理为空字符串。 - 数组整理:将临时存储的对象按索引排序后,整理为符合要求的JSON数组。
内容的提问来源于stack exchange,提问作者developer-logs
相关产品推荐
相关产品推荐

