26

我正在使用 Node.js(使用 Express.js)将 JSON 数据对象从服务器传递到客户端视图。

当我将 JSON 对象直接呈现到视图时,我得到了页面上显示的 JSON 对象,如预期的那样(这个 WORKS):

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 接受这种格式?

有什么想法吗?

4

4 回答 4

30

这是因为当你打电话

    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 工具)

于 2012-06-21T22:13:44.907 回答
22

在 ejs 中,它的<%- tagsJSON %>

          ^ <---- Note the "-"
于 2012-11-17T09:01:36.403 回答
11

使用 Swig.js 时更好的解决方案

{{ data|json|raw }}

于 2014-03-07T18:33:48.530 回答
5

Swig 模板引擎方法:

由于没有提到 Swig,我将添加我的版本。

我今天遇到了这个问题,花了好几个小时试图让它工作,这样我就可以将数据发送到 Chart.js: http: //www.chartjs.org/docs/

就我而言,我使用的是 Geddy.js 而不是 Express.js。像原始海报一样,我也遇到了 html 转义 JSON 字符串问题。

我正在使用 Swig 模板引擎。

感谢 Juan Mendes 提到html escaping,我发现了 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 %}
于 2013-08-17T16:37:31.677 回答