如何使用JavaScript在终端浏览目录查找JSON文件并按目录合并为单个JSON文件
如何用Node.js遍历目录并合并每个目录下的JSON文件
嘿,我懂你想要实现的功能——遍历目录查找JSON文件,把每个目录里的所有JSON文件合并成一个单独的JSON文件,而且你是JavaScript入门选手,需要能在终端运行的代码。没问题,咱们用Node.js来搞定,它自带的文件系统(fs)和路径处理(path)模块就足够了,不用额外安装第三方包,对新手很友好。
完整代码示例
把下面的代码保存成merge-json.js文件:
// 导入Node.js内置的文件系统和路径模块 const fs = require('fs').promises; const path = require('path'); // 定义要处理的根目录(你可以改成自己需要的路径,比如 './my-json-directories') const ROOT_DIR = './target-directory'; // 核心异步函数:处理单个目录,合并其中的JSON文件 async function mergeDirectoryJson(dirPath) { try { // 读取当前目录下的所有文件/子目录 const files = await fs.readdir(dirPath); // 筛选出所有.json后缀的文件 const jsonFiles = files.filter(file => path.extname(file) === '.json'); if (jsonFiles.length === 0) { console.log(`目录 ${dirPath} 中没有JSON文件,跳过`); return; } // 存储所有解析后的JSON数据 let mergedData = []; // 如果你的JSON文件都是数组,用这个 // let mergedData = {}; // 如果你的JSON文件都是对象,用这个,二选一 // 遍历每个JSON文件,读取并解析 for (const file of jsonFiles) { const filePath = path.join(dirPath, file); const fileContent = await fs.readFile(filePath, 'utf8'); try { const jsonData = JSON.parse(fileContent); // 根据你选择的mergedData类型来合并 if (Array.isArray(mergedData)) { // 如果是数组,直接把当前JSON数组的元素加进去(如果当前文件是数组的话) // 如果单个JSON文件是对象,就直接push这个对象 mergedData = mergedData.concat(jsonData); } else { // 如果是对象,合并属性(后面的文件会覆盖前面同名属性) mergedData = {...mergedData, ...jsonData}; } } catch (parseError) { console.error(`解析文件 ${filePath} 时出错: ${parseError.message}`); } } // 生成合并后的文件路径(存在当前目录下,名为merged.json) const mergedFilePath = path.join(dirPath, 'merged.json'); // 将合并后的数据转成JSON字符串,格式化缩进2空格,方便阅读 await fs.writeFile(mergedFilePath, JSON.stringify(mergedData, null, 2)); console.log(`成功合并 ${dirPath} 下的JSON文件到 ${mergedFilePath}`); } catch (error) { console.error(`处理目录 ${dirPath} 时出错: ${error.message}`); } } // 遍历根目录下的所有一级目录,逐个处理 async function processRootDirectory() { try { const entries = await fs.readdir(ROOT_DIR, { withFileTypes: true }); // 筛选出所有目录(排除文件) const directories = entries.filter(entry => entry.isDirectory()).map(entry => entry.name); for (const dirName of directories) { const dirPath = path.join(ROOT_DIR, dirName); await mergeDirectoryJson(dirPath); } // 如果你还想处理根目录本身的JSON文件,取消下面这行注释 // await mergeDirectoryJson(ROOT_DIR); } catch (error) { console.error(`处理根目录 ${ROOT_DIR} 时出错: ${error.message}`); } } // 启动程序 processRootDirectory();
代码说明(适合入门选手)
- 模块导入:
fs.promises是异步版本的文件操作API,用async/await语法写起来更像同步代码,比回调函数容易理解。 - 根目录配置:修改
ROOT_DIR为你想要处理的目录路径,相对路径绝对路径都可以。 - 合并逻辑选择:代码里提供了两种合并方式:
- 数组合并:适合每个JSON文件都是数组的情况,会把所有数组合并成一个大数组。
- 对象合并:适合每个JSON文件都是键值对对象的情况,后面文件的同名属性会覆盖前面的。
- 错误处理:每个步骤都加了错误捕获,避免一个文件出错导致整个程序崩溃,还会打印错误信息方便排查。
如何运行
- 确保你已经安装了Node.js(终端输入
node -v能看到版本号就说明安装好了)。 - 把上面的代码保存成
merge-json.js。 - 打开终端,进入代码所在的目录,运行命令:
node merge-json.js
额外提示
- 如果需要递归处理所有嵌套子目录(比如根目录下的子目录里还有子目录),可以修改
processRootDirectory函数,让它递归遍历所有目录,需要的话可以告诉我,我再给你调整代码。 - 确保所有JSON文件格式都是正确的,否则解析时会报错,程序会跳过出错的文件继续处理其他的。
内容的提问来源于stack exchange,提问作者Tassisto
相关产品推荐
相关产品推荐

