使用Handlebars生成JSON

时间:2016-11-18 18:32:29

标签: javascript json handlebars.js

我需要将把手模板中的一小部分HTML转换为JSON对象的一部分。以下是Handlebars模板的相关部分:

<ul>
  {{#each props.items}}
    <li>
      <a>{{name}}</a>
    </li>
  {{/each}}
</ul>

我面临的问题是我需要JSON对象中的最终输出是一个字符串数组(最终代码的每一行一个)或一个没有换行符的字符串。相反,我将整个最终块作为单个字符串,但带有换行符 - 这使得JSON无效。

我没有Handlebars模板或JSON,所以我不能改变其中任何一个。

以下是我目前的代码:

var fileContents = Plugins.fs.readFileSync(hbsPath,  "utf8");

//Next line is my latest attempt to close each line with quotes, 
//inject a newline and start new line with quotes.
//It doesn't work - the newline isn't inserted.
//I've also tried \n\r, \r\n, \r

fileContents = fileContents.replace(/(\r\n|\n|\r)/gm, "\",\n\"");

var template = hbs.compile(fileContents);
var thisProps = {props: props};
return new hbs.SafeString(template(thisProps));

如果我只是将返回的字符串写入控制台,它看起来是正确的,但是当我用它创建JSON文件时,未终止的字符串被标记为无效。

更新:这是JSON进入图片的地方:

{
    "code" : [{{renderSnippet "MyPartial" MyModel }}]
}

这是Handlebars处理的文件,{{ }}内的部分文件被Handlebars中的字符串替换。该字符串是问题 - 它包括使其无效JSON的换行符。我需要使它成为一个没有换行符的单个字符串,或者是一个字符串数组,每行作为一个单独的字符串。

任何指针?

感谢。

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,Handlebars不会创建JSON。 Handlebars是一个针对html的模板引擎,因此它只适用于html或具有相同或类似转义的语言。您需要将{{renderSnippet "MyPartial" MyModel }}的结果存储在转换为JSON的对象中。

类似的东西:

var renderSnippedTpl = Handlebars.compile('{{renderSnippet "MyPartial" MyModel }}');

var obj = {
   code : [renderSnippedTpl({/*required params*/})]
}

console.log( JSON.stringify(obj) );