如何利用外部JSON数据填充目标JSON中的变量以实现动态JSON内容?
解决方案:用外部JSON变量填充目标JSON的占位符
你遇到的问题确实很常见——json-variables库只能处理同文件内的变量,没法用外部JSON数据源来替换占位符。下面给你两个靠谱的实现方案,都是我实际项目里用过的,亲测好用:
方案一:手动实现递归替换函数(最灵活可控)
这个方案完全自定义,你可以根据自己的占位符格式(比如@@var1@@)来调整,而且能处理嵌套的JSON结构,不管目标JSON有多复杂都能搞定。
步骤很简单:
- 加载外部变量JSON和目标JSON
- 写一个递归函数,遍历目标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。
步骤:
- 安装Handlebars:
npm install handlebars - 把目标JSON的占位符改成Handlebars的格式(比如
{{var1}}) - 加载外部变量和目标模板,渲染后解析成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
相关产品推荐
相关产品推荐

