如何用Node.js或Shell脚本合并多JSON文件指定对象至新JSON文件
批量提取并合并JSON文件指定对象的实现方案
我来给你两个实用的方案,分别用Node.js和Shell脚本实现,都能自动识别目录下所有.json文件,完美满足你的需求~
方案一:Node.js脚本(无需额外依赖)
如果你已经有Node.js环境,这个方案最省心,不用装任何第三方包,用Node自带的模块就能搞定:
- 在存放JSON文件的目录下创建一个
merge-json.js文件 - 把下面的代码复制进去,记得替换
TARGET_OBJECT_PATH为你要提取的对象路径(比如你要取根节点下的data对象,就写"data";如果是嵌套的user.profile,就改成["user", "profile"])
const fs = require('fs').promises; const path = require('path'); // 配置:要提取的目标对象路径,支持嵌套 const TARGET_OBJECT_PATH = ["user"]; // 示例:提取每个JSON里的user对象 const OUTPUT_FILE = "final.json"; // 从JSON对象中提取指定路径的内容 function getNestedValue(obj, pathArray) { return pathArray.reduce((current, key) => { return current && current[key] !== undefined ? current[key] : null; }, obj); } async function mergeJsonFiles() { try { // 获取当前目录下所有.json文件 const files = await fs.readdir(process.cwd()); const jsonFiles = files.filter(file => path.extname(file).toLowerCase() === '.json' && file !== OUTPUT_FILE); if (jsonFiles.length === 0) { console.log("没有找到任何.json文件!"); return; } // 遍历所有JSON文件,提取目标对象 const mergedData = []; for (const file of jsonFiles) { try { const fileContent = await fs.readFile(path.join(process.cwd(), file), 'utf8'); const jsonData = JSON.parse(fileContent); const targetObj = getNestedValue(jsonData, TARGET_OBJECT_PATH); if (targetObj !== null) { mergedData.push(targetObj); console.log(`已提取 ${file} 中的目标对象`); } else { console.warn(`${file} 中未找到指定的目标对象,已跳过`); } } catch (error) { console.error(`处理 ${file} 时出错:`, error.message); } } // 将合并后的数据写入final.json await fs.writeFile(OUTPUT_FILE, JSON.stringify(mergedData, null, 2), 'utf8'); console.log(`合并完成!结果已保存到 ${OUTPUT_FILE}`); } catch (error) { console.error("执行过程中出错:", error.message); } } mergeJsonFiles();
- 打开终端,进入该目录,运行命令:
node merge-json.js
方案二:Shell脚本(用jq工具,更简洁)
如果你用的是Linux/macOS,或者Windows的WSL环境,用jq工具会更简洁,它是专门处理JSON的命令行工具:
首先安装jq:
- Ubuntu/Debian:
sudo apt update && sudo apt install jq - macOS:
brew install jq - Windows(WSL):和Linux一样用apt安装
- Ubuntu/Debian:
在目标目录下创建
merge-json.sh脚本文件,复制下面的代码,替换TARGET_PATH为你要提取的JSON路径(比如.data.user表示根节点下data里的user对象):
#!/bin/bash # 配置:要提取的JSON路径(jq语法) TARGET_PATH=".user" OUTPUT_FILE="final.json" # 检查jq是否安装 if ! command -v jq &> /dev/null; then echo "错误:未找到jq工具,请先安装jq!" exit 1 fi # 检查是否有.json文件 if ls *.json 1> /dev/null 2>&1; then # 合并所有.json文件的目标对象到final.json jq -s "map($TARGET_PATH)" *.json > "$OUTPUT_FILE" echo "合并完成!结果已保存到 $OUTPUT_FILE" else echo "错误:当前目录下没有.json文件!" exit 1 fi
- 给脚本添加执行权限:
chmod +x merge-json.sh
- 运行脚本:
./merge-json.sh
小提示
- 如果你的合并需求不是把所有对象放到数组里,而是要合并成一个对象(比如用某个字段作为键),可以修改代码:
- Node.js里可以用
Object.fromEntries(mergedData.map(item => [item.id, item])) - Shell里可以用
jq -s "reduce .[] as \$item ({}; .[\$item.id] = \$item.$TARGET_PATH)" *.json(替换id为你要用的键字段)
- Node.js里可以用
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

