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

如何利用外部JSON数据填充目标JSON中的变量以实现动态JSON内容?

解决方案:用外部JSON变量填充目标JSON的占位符

你遇到的问题确实很常见——json-variables库只能处理同文件内的变量,没法用外部JSON数据源来替换占位符。下面给你两个靠谱的实现方案,都是我实际项目里用过的,亲测好用:

方案一:手动实现递归替换函数(最灵活可控)

这个方案完全自定义,你可以根据自己的占位符格式(比如@@var1@@)来调整,而且能处理嵌套的JSON结构,不管目标JSON有多复杂都能搞定。

步骤很简单:

  1. 加载外部变量JSON和目标JSON
  2. 写一个递归函数,遍历目标JSON的每一个值,如果是字符串且包含占位符,就用外部变量替换;如果是对象/数组,就继续递归处理

示例代码:

const fs = require('fs');

// 1. 加载外部变量和目标JSON
const externalVars = JSON.parse(fs.readFileSync('./external-vars.json', 'utf8'));
const targetJson = JSON.parse(fs.readFileSync('./target-template.json', 'utf8'));

// 2. 递归替换占位符的函数
function replacePlaceholders(obj, vars) {
  // 处理数组
  if (Array.isArray(obj)) {
    return obj.map(item => replacePlaceholders(item, vars));
  }
  // 处理对象
  if (typeof obj === 'object' && obj !== null) {
    const result = {};
    for (const key in obj) {
      result[key] = replacePlaceholders(obj[key], vars);
    }
    return result;
  }
  // 处理字符串,替换@@var@@格式的占位符
  if (typeof obj === 'string') {
    return obj.replace(/@@(\w+)@@/g, (match, varName) => {
      return vars[varName] !== undefined ? vars[varName] : match; // 如果变量不存在,保留原占位符
    });
  }
  // 其他类型(数字、布尔值等)直接返回
  return obj;
}

// 执行替换
const finalJson = replacePlaceholders(targetJson, externalVars);

// 输出结果
console.log(JSON.stringify(finalJson, null, 4));

比如你的外部变量文件external-vars.json:

{"var1": "samy", "var2":"something"}

目标模板文件target-template.json:

{"name": "@@var1@@", "lastname":"@@var2@@", "contacts": ["@@var1@@@example.com", {"phone": "@@var3@@"}]}

执行后会得到:

{
    "name": "samy",
    "lastname": "something",
    "contacts": [
        "samy@example.com",
        {
            "phone": "@@var3@@"
        }
    ]
}

(注意:如果外部变量里没有var3,会保留原占位符,你可以根据需求改成抛出错误或者替换为空字符串)

方案二:使用Handlebars模板引擎(快速实现)

如果你不想自己写递归逻辑,可以用成熟的模板引擎来处理,比如Handlebars。思路是把目标JSON转成Handlebars模板字符串,然后用外部变量渲染,最后再转回JSON。

步骤:

  1. 安装Handlebars:npm install handlebars
  2. 把目标JSON的占位符改成Handlebars的格式(比如{{var1}})
  3. 加载外部变量和目标模板,渲染后解析成JSON

示例代码:

const fs = require('fs');
const handlebars = require('handlebars');

// 1. 加载外部变量和目标模板(注意目标JSON要改成Handlebars格式)
const externalVars = JSON.parse(fs.readFileSync('./external-vars.json', 'utf8'));
const targetTemplateStr = fs.readFileSync('./target-handlebars-template.json', 'utf8');

// 2. 编译模板并渲染
const template = handlebars.compile(targetTemplateStr);
const renderedStr = template(externalVars);

// 3. 转回JSON
const finalJson = JSON.parse(renderedStr);

// 输出结果
console.log(JSON.stringify(finalJson, null, 4));

对应的target-handlebars-template.json内容:

{"name": "{{var1}}", "lastname":"{{var2}}"}

这个方案优点是代码少,不用自己处理递归,但要注意占位符格式要改成Handlebars的语法,而且如果目标JSON里有特殊字符(比如{{),需要转义。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:32:38