如何基于公共字段合并子数组?多同名数组字段合并方案咨询
合并JSON中重复键
line的数组内容 问题描述
输入的JSON字符串包含多个同名的line字段,每个字段对应一个对象数组,需要将所有line字段下的对象合并到同一个line数组中。
输入Payload
{"ID":"102B0YT0","line":[{"Number":1,"quantityd":18,"Shipped":15}],"line":[{"Number":2,"quantity":58,"Shipped":8},{"lineNumber":2,"quantity":59,"Shipped":9}],"line":[{"lineNumber":3,"Ordered":11,"Shipped":17}]}
期望输出
{"ID":"102B0YT0","line":[{"Number":1,"quantityd":18,"Shipped":15},{"Number":2,"quantity":58,"Shipped":8},{"lineNumber":2,"quantity":59,"Shipped":9},{"lineNumber":3,"Ordered":11,"Shipped":17}]}
解决方案
由于标准JSON不允许重复键,直接解析会丢失前面的line数据,因此需要先以文本形式提取所有line对应的数组内容,再合并构造新的JSON对象。
JavaScript 实现
// 原始输入字符串 const inputStr = '{"ID":"102B0YT0","line":[{"Number":1,"quantityd":18,"Shipped":15}],"line":[{"Number":2,"quantity":58,"Shipped":8},{"lineNumber":2,"quantity":59,"Shipped":9}],"line":[{"lineNumber":3,"Ordered":11,"Shipped":17}]}'; // 提取所有line字段对应的数组元素 const mergedLines = []; const lineRegex = /"line":(\[.*?\])/g; let matchResult; while ((matchResult = lineRegex.exec(inputStr)) !== null) { mergedLines.push(...JSON.parse(matchResult[1])); } // 解析基础对象并替换line字段 const resultObj = JSON.parse(inputStr); resultObj.line = mergedLines; // 输出格式化后的结果 console.log(JSON.stringify(resultObj, null, 2));
Python 实现
import re import json input_str = '{"ID":"102B0YT0","line":[{"Number":1,"quantityd":18,"Shipped":15}],"line":[{"Number":2,"quantity":58,"Shipped":8},{"lineNumber":2,"quantity":59,"Shipped":9}],"line":[{"lineNumber":3,"Ordered":11,"Shipped":17}]}' # 提取所有line数组的元素 merged_lines = [] line_pattern = re.compile(r'"line":(\[.*?\])') for match in line_pattern.finditer(input_str): merged_lines.extend(json.loads(match.group(1))) # 构造结果对象 result_obj = json.loads(input_str) result_obj['line'] = merged_lines # 打印输出 print(json.dumps(result_obj, indent=2))
逻辑说明
- 文本提取:使用正则表达式从原始字符串中匹配所有
"line":[]部分,解析每个数组并合并其中的元素。 - 构造结果:将原始JSON解析为对象(此时仅保留最后一个
line),替换line字段为合并后的数组。 - 输出:将结果对象序列化为格式化的JSON字符串。
内容的提问来源于stack exchange,提问作者james11
相关产品推荐
相关产品推荐

