如何合并JSON数组节点并聚合子元素值为字符串数组?
提取JSON数组指定字段并保留原结构的最优实现方法
需求概述
保留原JSON的层级键结构,将每个数组类型节点中的子元素的指定字段(示例中为type)的值提取出来,组成字符串数组替换原数组。
核心实现思路
- 遍历层级结构:递归遍历JSON的每个节点,区分对象、数组和基础类型。
- 数组节点处理:遇到数组时,遍历数组内的每个对象元素,提取目标字段的值,组成新的字符串数组。
- 非数组节点保留:对象节点继续递归处理子节点,基础类型直接返回原值,确保原结构不变。
- 容错处理:判断数组元素是否为对象且包含目标字段,避免提取过程中出现报错。
代码实现示例
Python 实现
def extract_target_field(data, target_field='type'): if isinstance(data, dict): # 递归处理字典的每个键值对 return {key: extract_target_field(value, target_field) for key, value in data.items()} elif isinstance(data, list): # 遍历数组元素,提取目标字段值(仅当元素是字典且包含目标字段时) return [item.get(target_field) for item in data if isinstance(item, dict) and target_field in item] else: # 基础类型直接返回 return data # 测试输入 input_data = { "client": { "addresses": [ {"id": "27ef465ef60d2705","type": "RegisteredOfficeAddress"}, {"id": "b7affb035be3f984","type": "PlaceOfBusiness"}, {"id": "a8a3bef166141206","type": "EmailAddress"} ], "links": [ {"id": "29a9de859e70799e","type": "Director","name": "Bob the Builder"}, {"id": "22493ad4c4fd8ac5","type": "Secretary","name": "Jennifer"} ], "Names": [ {"id": "53977967eadfffcd","type": "EntityName","name": "Banjo"} ] } } # 执行提取 output_data = extract_target_field(input_data) print(output_data)
JavaScript 实现
function extractTargetField(data, targetField = 'type') { if (typeof data === 'object' && !Array.isArray(data)) { const result = {}; // 遍历对象的每个键,递归处理子节点 for (const key in data) { result[key] = extractTargetField(data[key], targetField); } return result; } else if (Array.isArray(data)) { // 提取数组元素的目标字段值,过滤掉不存在的情况 return data.map(item => item?.[targetField]).filter(val => val !== undefined); } // 基础类型直接返回 return data; } // 测试输入 const inputData = { "client": { "addresses": [ {"id": "27ef465ef60d2705","type": "RegisteredOfficeAddress"}, {"id": "b7affb035be3f984","type": "PlaceOfBusiness"}, {"id": "a8a3bef166141206","type": "EmailAddress"} ], "links": [ {"id": "29a9de859e70799e","type": "Director","name": "Bob the Builder"}, {"id": "22493ad4c4fd8ac5","type": "Secretary","name": "Jennifer"} ], "Names": [ {"id": "53977967eadfffcd","type": "EntityName","name": "Banjo"} ] } }; // 执行提取 const outputData = extractTargetField(inputData); console.log(outputData);
方法优势与扩展说明
- 通用性强:支持任意深度的嵌套结构,只需修改
target_field参数即可提取其他字段。 - 高效简洁:递归处理逻辑清晰,时间复杂度为O(n)(n为JSON中所有元素的数量),大部分场景下性能足够。
- 容错性好:加入了类型判断和字段存在性校验,避免因数据格式异常导致程序崩溃。
- 超大JSON处理:如果处理GB级别的超大JSON,可改用流式解析库(如Python的
ijson、JavaScript的stream-json),避免一次性加载全部数据到内存。
内容的提问来源于stack exchange,提问作者ronMilne
相关产品推荐
相关产品推荐

