递归迁移嵌套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));
额外注意事项:
- 重复键优先级:以上所有方法都是让内层
dataQuery中的键值对覆盖外层的,如果你需要保留外层值,只需调整合并顺序(比如Python中先合并dataQuery再处理子元素,但这样不符合你的示例需求)。 - 性能问题:3-4MB的JSON属于中小型文件,这三种方法都能轻松处理,不会出现内存溢出的问题。如果是几十MB以上的超大JSON,可以考虑用流式处理(比如Python的
ijson库,jq本身就是流式处理)。
备注:内容来源于stack exchange,提问作者Prashant
相关产品推荐
相关产品推荐

