NodeJS在JSON文件字符串中使用变量

时间:2018-09-08 19:37:37

标签: javascript json string variables interpolation

我对常用短语使用JSON文件,因此不必键入它们,也许将来可以翻译它们。例如,在我的主要代码中,我想说You don't have the permission to use ${command_name}。可以很好地将其硬编码到我的.js文件中,但最终我希望将其保存在JSON文件中,该文件不允许插入任何变量。

有人知道我的问题的解决方案吗?

编辑:感谢您的建议。我猜string.replace是我最好的选择。希望有一些内置功能可以将JSON字符串中的变量转换为该JS文件中声明的变量。

6 个答案:

答案 0 :(得分:1)

您不能像在Javascript“代码”中那样对待JSON文件中的模板字符串文本。你自己说的但是:您可以为此使用模板引擎-或仅使用简单的String.replace()

模板引擎示例:https://github.com/janl/mustache.js

使用小胡子(例如),您的代码将如下所示

var trans = {
  command_name: "dump"
};

var output = Mustache.render("You don't have the permission to use {{command_name}}", trans);

使用简单的String.replace()

var str = "You don't have the permission to use %command_name%";

console.log(str.replace('%command_name%', 'dump'));

答案 1 :(得分:1)

您可以简单地使用占位符。以下函数用用户定义的值替换占位符:

const messages = {
  msgName: 'Foo is :foo: and bar is :bar:!'
}

function _(key, placeholders) {
  return messages[key].replace(/:(\w+):/g, function(__, item) {
    return placeholders[item] || item;
  });
}

用法:

_('msgName', { foo: 'one', bar: 'two' })
// "Foo is one and bar is two!"

这只是一个例子。您可以按照自己的方式更改占位符样式和函数行为!

答案 2 :(得分:0)

您可以使用config npm模块并根据您的环境分离JSON文件。

答案 3 :(得分:0)

./ name.json

{
    command: "this is the output of 'command'"
}

./ Node.js

cost names = require('./name.json');

console.log('name === ', name.command);
// name === this is the output of 'command'

答案 4 :(得分:0)

所以主要的挑战是当其中一些参数可设置参数时,使用字符串常量来分离文件,对吧?

JSON格式本身对字符串(数字,布尔值,列表和哈希图)进行操作,对替换和参数一无所知。

由于模板字符串会立即插入,因此您也无法使用you don't have permission to do ${actionName}之类的模板字符串。

那你能做什么?

  1. 编写自己的解析器,该解析器从JSON文件中获取配置数据,解析字符串,找到对变量的引用,并将其替换为值。简单的例子:

    const varPattern = / \ $ {([^ {}] +)} / g; 函数replaceVarWithValue(templateStr,params){     返回templateStr.replace(varPattern,(fullMatch,varName)=> params [varName] || fullMatch); }

  2. ,或者您可以使用任何针对本地化的npm软件包,例如i18n,这样它将为您处理模板

答案 5 :(得分:0)

基本上,您可以实现函数parse,给定文本和字典,该函数可以代替每个字典键的出现:

const parse = (template, textMap) => {
  let output = template

  for (let [id, text] of Object.entries(textMap)) {
    output = output.replace(new RegExp(`\\$\{${id}}`, 'mg'), text)
  }

  return output
}

const textMap = {
  commandName: 'grep',
  foo: 'hello',
  bar: 'world'
}

const parsed = parse('command "${commandName}" said "${foo} ${bar}"', textMap)

console.log(parsed)

顺便说一句,我建议您使用一些现有的字符串模板引擎,例如string-template,以避免重新发明轮子。