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

如何用Node.js或Shell脚本合并多JSON文件指定对象至新JSON文件

批量提取并合并JSON文件指定对象的实现方案

我来给你两个实用的方案,分别用Node.js和Shell脚本实现,都能自动识别目录下所有.json文件,完美满足你的需求~

方案一:Node.js脚本(无需额外依赖)

如果你已经有Node.js环境,这个方案最省心,不用装任何第三方包,用Node自带的模块就能搞定:

  1. 在存放JSON文件的目录下创建一个merge-json.js文件
  2. 把下面的代码复制进去,记得替换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();
  1. 打开终端,进入该目录,运行命令:
node merge-json.js

方案二:Shell脚本(用jq工具,更简洁)

如果你用的是Linux/macOS,或者Windows的WSL环境,用jq工具会更简洁,它是专门处理JSON的命令行工具:

  1. 首先安装jq:

    • Ubuntu/Debian:sudo apt update && sudo apt install jq
    • macOS:brew install jq
    • Windows(WSL):和Linux一样用apt安装
  2. 在目标目录下创建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
  1. 给脚本添加执行权限:
chmod +x merge-json.sh
  1. 运行脚本:
./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为你要用的键字段)

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:54:09