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

递归迁移嵌套JSON中dataQuery字段内容至上一层并删除该字段的实现方法咨询

递归迁移嵌套JSON中dataQuery字段内容至上一层并删除该字段的实现方法咨询

嘿,这个需求挺常见的——要把嵌套JSON里所有dataQuery字段的内容“提上来”到父层级,还要删掉这个字段本身,同时处理深层嵌套甚至重复键的情况(就像你例子里的duplicateKey,最终保留最内层的值)。结合你提到的JSON可能达到3-4MB的规模,我给你分享几个靠谱的实现方式:

方法一:Python递归处理(适合编程场景)

Python的json库处理几MB的JSON完全没问题,递归逻辑也容易理解,还能自动处理重复键的覆盖(内层值优先)。

import json

def flatten_dataquery(obj):
    if isinstance(obj, dict):
        # 先递归处理所有子字典,确保深层的dataQuery先被解析
        processed = {}
        for key, value in obj.items():
            processed[key] = flatten_dataquery(value)
        
        # 检查当前字典是否包含dataQuery键
        if 'dataQuery' in processed:
            # 将dataQuery内的内容合并到当前字典,重复键会被内层值覆盖
            processed.update(processed.pop('dataQuery'))
        return processed
    elif isinstance(obj, list):
        # 递归处理列表中的每一个元素
        return [flatten_dataquery(item) for item in obj]
    else:
        # 非字典/列表的原始类型直接返回
        return obj

# 示例用法:读取原始JSON,转换后写入新文件
with open('input.json', 'r') as f:
    original_json = json.load(f)

transformed_json = flatten_dataquery(original_json)

with open('output.json', 'w') as f:
    json.dump(transformed_json, f, indent=2)

这个脚本会先处理最内层的dataQuery,再逐层向外合并,完美匹配你示例中duplicateKey保留最内层value2的需求。

方法二:jq命令行工具(适合快速批量处理)

如果你习惯用命令行,jq是专门处理JSON的高效工具,几MB的JSON文件处理起来毫无压力,一行命令就能搞定:

jq 'def flatten_dataquery:
    if type == "object" then
        . | del(.dataQuery) + (.dataQuery // {} | flatten_dataquery)
    elif type == "array" then
        map(flatten_dataquery)
    else
        .
    end;
flatten_dataquery' input.json > output.json

逻辑说明:

  • 定义递归函数flatten_dataquery,先处理对象的所有子元素
  • 对于对象类型,先删除当前层级的dataQuery,再把dataQuery的内容(递归处理后)合并到当前对象
  • // {}用来处理dataQuery不存在的情况,避免报错
  • 数组类型则对每个元素递归执行函数

同样会实现内层dataQuery键值覆盖外层的效果,和你的示例一致。

方法三:JavaScript/Node.js处理(适合前端/Node环境)

如果你的场景是前端或者Node.js服务,也可以用递归函数实现:

const fs = require('fs');

function flattenDataQuery(obj) {
    if (typeof obj === 'object' && obj !== null) {
        if (Array.isArray(obj)) {
            return obj.map(item => flattenDataQuery(item));
        } else {
            const processed = {};
            // 先递归处理所有子属性
            for (const key in obj) {
                processed[key] = flattenDataQuery(obj[key]);
            }
            // 合并dataQuery内容并删除该键
            if (processed.dataQuery) {
                Object.assign(processed, processed.dataQuery);
                delete processed.dataQuery;
            }
            return processed;
        }
    }
    return obj;
}

// 示例用法
const originalJson = JSON.parse(fs.readFileSync('input.json', 'utf8'));
const transformedJson = flattenDataQuery(originalJson);
fs.writeFileSync('output.json', JSON.stringify(transformedJson, null, 2));

额外注意事项:

  1. 重复键优先级:以上所有方法都是让内层dataQuery中的键值对覆盖外层的,如果你需要保留外层值,只需调整合并顺序(比如Python中先合并dataQuery再处理子元素,但这样不符合你的示例需求)。
  2. 性能问题:3-4MB的JSON属于中小型文件,这三种方法都能轻松处理,不会出现内存溢出的问题。如果是几十MB以上的超大JSON,可以考虑用流式处理(比如Python的ijson库,jq本身就是流式处理)。

备注:内容来源于stack exchange,提问作者Prashant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 08:43:16