文章目录
背景:今天遇到接口返回的 EventStream 结构的数据,由于http 流式传输时,可能会分段,所以导致本该每次返回一段json数据结构的字符串,变成了多个json数据结构的字符串拼接在了一起。
- 例如:
js
'{a: 1}{a: 2}{a: 3}'
- 现在想要得到这种的:
js
[{a: 1}, {a: 2}, {a: 3}]
- 函数实现:支持深层嵌套的json结构
js
function parseMultiJson(jsonStr) {
const jsonArr = [];
let startIndex = 0;
let endIndex = 0;
while (startIndex < jsonStr.length) {
// 找到一个 JSON 对象的开始位置
startIndex = jsonStr.indexOf('{', startIndex);
if (startIndex === -1) {
break;
}
// 找到一个 JSON 对象的结束位置
let openBrackets = 1;
endIndex = startIndex + 1;
while (openBrackets > 0 && endIndex < jsonStr.length) {
if (jsonStr[endIndex] === '{') {
openBrackets++;
} else if (jsonStr[endIndex] === '}') {
openBrackets--;
}
endIndex++;
}
// 将该 JSON 对象解析为一个对象,并添加到数组中
const json = jsonStr.substring(startIndex, endIndex);
jsonArr.push(JSON.parse(json));
// 更新下一个 JSON 对象的开始位置
startIndex = endIndex;
}
return jsonArr;
}
- 效果:
js
const arr = parseMultiJson('{a: 1}{a: 2}{a: 3}')
console.log(arr) // [{a: 1}, {a: 2}, {a: 3}]