如何合并多个同结构JSON文件并去重(保持原结构)
合并多个JSON文件并去重数组内容
方法一:Python 脚本(跨平台通用)
这种方法灵活可控,适合需要自定义逻辑或批量处理大量文件的场景。
实现代码
import json import os from typing import List, Dict def merge_json_files(input_files: List[str], output_file: str): merged_data = { "version": "", "vulnerabilities": [], "dependency_files": [] } # 存储已存在的ID和名称,用于去重 seen_vuln_ids = set() seen_dep_names = set() for file_path in input_files: if not os.path.exists(file_path): print(f"警告:文件 {file_path} 不存在,跳过") continue with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) # 初始化version(所有文件版本一致,取第一个即可) if not merged_data["version"]: merged_data["version"] = data["version"] # 处理vulnerabilities数组,按id去重 for vuln in data.get("vulnerabilities", []): vuln_id = vuln.get("id") if vuln_id and vuln_id not in seen_vuln_ids: seen_vuln_ids.add(vuln_id) merged_data["vulnerabilities"].append(vuln) # 处理dependency_files数组,按name去重 for dep in data.get("dependency_files", []): dep_name = dep.get("name") if dep_name and dep_name not in seen_dep_names: seen_dep_names.add(dep_name) merged_data["dependency_files"].append(dep) # 写入输出文件 with open(output_file, 'w', encoding='utf-8') as f: json.dump(merged_data, f, indent=4) # 使用示例 if __name__ == "__main__": input_files = ["file1.json", "file2.json"] # 可添加更多文件 merge_json_files(input_files, "onefile.json") print("合并完成,结果已保存到onefile.json")
使用说明
- 将上述代码保存为
merge_json.py - 把需要合并的JSON文件放在同目录下,修改
input_files列表添加所有目标文件 - 运行命令:
python merge_json.py
方法二:jq 命令行工具(适合Linux/macOS)
如果熟悉命令行,jq是高效的JSON处理工具,无需编写脚本。
合并命令
jq -n ' reduce inputs as $in ( {version: "", vulnerabilities: [], dependency_files: []}; .version = $in.version | .vulnerabilities += $in.vulnerabilities | .dependency_files += $in.dependency_files ) | .vulnerabilities = [.vulnerabilities[] | unique_by(.id)] | .dependency_files = [.dependency_files[] | unique_by(.name)] ' file1.json file2.json > onefile.json
命令解释
reduce inputs as $in:遍历所有输入的JSON文件- 先合并两个数组,再用
unique_by(.id)和unique_by(.name)分别对两个数组去重 - 最终结果重定向到
onefile.json
注意事项
- 需要先安装jq:
sudo apt install jq(Debian/Ubuntu)或brew install jq(macOS) - 若有更多文件,直接在命令末尾添加即可,比如
file1.json file2.json file3.json
内容的提问来源于stack exchange,提问作者Eklas Aldwairi
相关产品推荐
相关产品推荐

