You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并JSON数组节点并聚合子元素值为字符串数组?

提取JSON数组指定字段并保留原结构的最优实现方法

需求概述

保留原JSON的层级键结构,将每个数组类型节点中的子元素的指定字段(示例中为type)的值提取出来,组成字符串数组替换原数组。

核心实现思路

  1. 遍历层级结构:递归遍历JSON的每个节点,区分对象、数组和基础类型。
  2. 数组节点处理:遇到数组时,遍历数组内的每个对象元素,提取目标字段的值,组成新的字符串数组。
  3. 非数组节点保留:对象节点继续递归处理子节点,基础类型直接返回原值,确保原结构不变。
  4. 容错处理:判断数组元素是否为对象且包含目标字段,避免提取过程中出现报错。

代码实现示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:10:58