Node.js JSON.stringify()导致“在输出中。无法用Jquery解析

时间:2012-06-21 22:04:20

标签: jquery json node.js express pug

我正在使用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接受这种格式?

有什么想法吗?

4 个答案:

答案 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)

<\ n>在ejs中,<%- tagsJSON %>

          ^ <---- Note the "-"

答案 2 :(得分:11)

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

{{ data|json|raw }}

答案 3 :(得分:4)

Swig Templating Engine方法:

由于没有提到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 %}
相关问题