我正在使用Node.js(使用Express.js)将JSON数据对象从服务器传递到客户端视图。
当我将JSON对象直接呈现给视图时,我按预期获得了页面上显示的JSON对象(本作品):
pageprovider.findAllTag( function(error, pages){
res.send(pages);
})
我的输出看起来像这样(更大,很多嵌套的obj)
{"green":{"title":"green","pagesContaining": ""}}
当我尝试将它传递给我的Jade View时:
pageprovider.findAllTag( function(error, tagsJSONObj){
//res.send(pages);
pageprovider.findAll( function(error, pages){
res.render('search_tags.jade', { locals: {
title: 'Search by Tags',
'pages': pages,
tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
}
});
}) //pageprovider.findAll
}) //pageprovider.findAllTag
问题
当我将'tagsJSON'传递给视图时,输出包含html实体:
var obj = jQuery.parseJSON( "{"name": 'value'}");
JQuery抛出一个错误,因为它不喜欢'“'。我如何让Node给我正确的引用,或让jQuery接受这种格式?
有什么想法吗?
答案 0 :(得分:25)
这是因为当你打电话时
res.render('search_tags.jade', { locals: {
title: 'Search by Tags',
'pages': pages,
tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
}
});
search_tags.jade
用于输出HTML,因此它会对您的引号进行编码。你应该使用一个没有HTML转义的渲染器,或者至少改变你的视图,以便你的参数不是HTML编码的
如果您不想在输出中转义某些内容,请在视图中使用!{tagsJSON}
。但是,在输出JSON时,不需要视图。你可以拿走你的物品,拨打JSON.stringify
。我不使用JADE所以我不确定是否有办法创建可以调用JSON.stringify()
的视图,但这就是我在JSP,velocity,ASP,PHP和Code Igniter中所做的事情(不是使用JSON.stringify
,而不是使用给定语言的JSON工具)
答案 1 :(得分:21)
<%- tagsJSON %>
^ <---- Note the "-"
答案 2 :(得分:11)
使用Swig.js时的更好解决方案
{{ data|json|raw }}
答案 3 :(得分:4)
由于没有提到Swig,我将添加我的版本。
我今天遇到了这个问题并花了几个小时试图让它工作,所以我可以将数据发送到Chart.js:http://www.chartjs.org/docs/
就我而言,我使用的是Geddy.js而不是Express.js。像原始海报一样,我也得到了html转义的JSON字符串问题。
我正在使用Swig模板引擎。
感谢Juan Mendes提到 html转义,我发现了Swig开发人员的讨论:
https://github.com/jnordberg/wintersmith-swig/pull/1
这导致我搜索禁用自动转义的选项。
我第一次尝试:
{{ data|raw }} // didn't work
正如github页面中提到的那样,但是没有用,所以我去了文档并发现了这个:
http://paularmstrong.github.io/swig/docs/tags/
黄金! :d
所以最终解决方案:
{% autoescape false %}
var data = {{ data }}
{% endautoescape %}