多行独立JSON对象指每一行都是一个完整的JSON对象,行与行之间没有逗号分隔,也没有外层的中括号包裹,这类数据结构在很多数据导出、日志记录场景中十分常见,比如每行记录一个用户操作日志的JSON对象。直接解析这类数据会报错,需要先将它们合并为标准JSON数组结构才能正常使用。

什么是标准JSON数组结构
标准JSON数组是由中括号包裹,内部多个JSON值用逗号分隔的结构,比如[{"id":1},{"id":2}]就是包含两个对象的JSON数组。而多行独立JSON对象的内容通常是这样的:
{"name":"张三","age":20}
{"name":"李四","age":22}
{"name":"王五","age":25}
使用JavaScript合并的方法
基础逐行读取合并
如果是前端处理或者Node.js环境,可以通过读取每一行内容,先解析为对象再统一放入数组的方式实现:
// 假设lines是多行独立JSON对象的字符串数组
const lines = [
'{"name":"张三","age":20}',
'{"name":"李四","age":22}',
'{"name":"王五","age":25}'
];
const resultArray = [];
for (const line of lines) {
// 跳过空行避免解析错误
if (line.trim() === '') continue;
try {
const obj = JSON.parse(line.trim());
resultArray.push(obj);
} catch (e) {
console.error('解析行内容失败:', line, e);
}
}
// 转换为标准JSON数组字符串
const jsonArrayStr = JSON.stringify(resultArray);
console.log(jsonArrayStr);
高效流式处理大文件
如果处理的是大文件,逐行读取全部内容到内存可能占用过高,可以使用流式处理的方式:
const fs = require('fs');
const readline = require('readline');
function mergeJsonLinesToArray(filePath) {
const resultArray = [];
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
rl.on('line', (line) => {
if (line.trim() === '') return;
try {
const obj = JSON.parse(line.trim());
resultArray.push(obj);
} catch (e) {
console.error('解析行失败:', line, e);
}
});
rl.on('close', () => {
const jsonArrayStr = JSON.stringify(resultArray);
console.log('合并完成,结果:', jsonArrayStr);
});
}
// 调用函数处理文件,假设文件地址是ipipp.com/data.jsonl
mergeJsonLinesToArray('ipipp.com/data.jsonl');
使用Python合并的方法
基础列表合并
Python中处理这类数据同样简单,利用内置的json模块即可实现:
import json
lines = [
'{"name":"张三","age":20}',
'{"name":"李四","age":22}',
'{"name":"王五","age":25}'
]
result_list = []
for line in lines:
line = line.strip()
if not line:
continue
try:
obj = json.loads(line)
result_list.append(obj)
except json.JSONDecodeError as e:
print(f'解析行失败: {line}, 错误: {e}')
# 转换为标准JSON数组字符串
json_array_str = json.dumps(result_list, ensure_ascii=False)
print(json_array_str)
大文件逐行处理
处理大文件时,Python可以逐行读取避免内存占用过高:
import json
def merge_json_lines(file_path):
result_list = []
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if not line:
continue
try:
obj = json.loads(line)
result_list.append(obj)
except json.JSONDecodeError as e:
print(f'解析行失败: {line}, 错误: {e}')
return json.dumps(result_list, ensure_ascii=False)
# 调用函数处理文件,假设文件地址是ipipp.com/data.jsonl
result = merge_json_lines('ipipp.com/data.jsonl')
print(result)
合并时的注意事项
- 需要处理空行,避免空行导致JSON解析报错
- 每一行的内容必须是合法的JSON对象,否则解析会失败,建议添加异常捕获逻辑
- 如果原始数据中有特殊字符,比如换行符在字符串内部,需要先处理转义再合并,避免拆分错误
- 合并后的JSON数组如果需要存储,注意编码问题,避免中文等字符出现乱码
性能对比
不同方法的适用场景不同,以下是常见方法的性能对比:
| 方法 | 适用场景 | 内存占用 | 处理速度 |
|---|---|---|---|
| JavaScript基础逐行合并 | 小数据量、内存充足场景 | 较高 | 快 |
| JavaScript流式处理 | 大文件、内存有限场景 | 低 | 中等 |
| Python基础列表合并 | 小数据量、内存充足场景 | 较高 | 快 |
| Python逐行读取处理 | 大文件、内存有限场景 | 低 | 中等 |
根据实际的数据量和运行环境选择合适的方法,就能高效完成多行独立JSON对象到标准JSON数组的合并工作。
JSON处理JSON数组多行数据合并JavaScript修改时间:2026-07-11 16:33:29