使用DataWeave将同键对象转换为对象数组的最优方案
处理含重复"row"键JSON的最优转换方案
问题描述
输入的JSON存在重复的"row"键(数量可能多达数千个),常规JSON解析器会自动覆盖重复键,需要将其转换为以"rows"为键、对应值为数组的格式:
输入示例:
{ "row":{ "name": "abc" }, "row":{ "school": "pqr" } }
期望输出:
{ "rows": [ { "name": "abc" }, { "school": "pqr" } ] }
核心思路
标准JSON规范不允许重复键,常规解析器会直接覆盖后续重复键的值,因此必须在解析阶段保留所有键值对,或直接处理原始JSON字符串,提取所有"row"对应的对象后重组结构。
分语言最优实现
Python 方案(推荐,支持复杂嵌套)
利用Python json模块的object_pairs_hook参数,直接获取原始键值对列表,过滤出所有"row"对应的值:
import json def transform_duplicate_row(raw_json): # 加载所有键值对,保留原始顺序 all_pairs = json.loads(raw_json, object_pairs_hook=list) rows = [value for key, value in all_pairs if key == "row"] return json.dumps({"rows": rows}, indent=2) # 测试示例 input_json = '''{ "row":{ "name": "abc" }, "row":{ "school": "pqr" } }''' print(transform_duplicate_row(input_json))
该方案由JSON底层解析器处理原始数据,可靠性高,支持row值为嵌套对象的场景,性能适配数千条数据的规模。
JavaScript 方案
简单场景(row值无嵌套对象)
用正则匹配所有"row":{...}片段,提取对象后重组:
function transformDuplicateRowJson(rawJson) { const rowRegex = /"row":\s*({[^}]+})/g; const rows = []; let match; while ((match = rowRegex.exec(rawJson)) !== null) { rows.push(JSON.parse(match[1])); } return JSON.stringify({ rows }, null, 2); } // 测试示例 const inputJson = `{ "row":{ "name": "abc" }, "row":{ "school": "pqr" } }`; console.log(transformDuplicateRowJson(inputJson));
复杂场景(row值含嵌套)
正则无法处理嵌套结构,可实现简单的流式token解析器,逐字符读取并识别"row"键对应的对象边界,收集所有对象后重组,这种方式性能高效,适合大规模数据。
内容的提问来源于stack exchange,提问作者Mule-Newbie
相关产品推荐
相关产品推荐

