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

Jam*_*les 21 jquery json node.js express pug

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

当我将JSON对象直接呈现给视图时,我按预期获得页面上显示的JSON对象(此工作):

pageprovider.findAllTag( function(error, pages){
    res.send(pages);
})
Run Code Online (Sandbox Code Playgroud)

我的输出看起来像这样(更大,许多嵌套的obj)

{"green":{"title":"green","pagesContaining": ""}}
Run Code Online (Sandbox Code Playgroud)

当我尝试将它传递给我的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
Run Code Online (Sandbox Code Playgroud)

问题
当我将'tagsJSON'传递给视图时,输出包含html实体:

var obj = jQuery.parseJSON( "{"name": 'value'}");
Run Code Online (Sandbox Code Playgroud)

JQuery抛出一个错误,因为它不喜欢'"'.我如何让Node给我正确的引用,或让jQuery接受这种格式?

有什么想法吗?

Jua*_*des 28

这是因为你打电话的时候

    res.render('search_tags.jade', { locals: {
        title: 'Search by Tags',
        'pages': pages,
        tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
        }
    });
Run Code Online (Sandbox Code Playgroud)

search_tags.jade用于输出HTML,因此它会对您的引号进行编码.您应该使用不进行HTML转义的渲染器,或者至少更改您的视图,以便您的参数不是HTML编码的

如果您不希望输出转义中的某些内容,请!{tagsJSON}在视图中使用.但是,在输出JSON时,不需要视图.你可以拿走你的物品,打电话JSON.stringify.我不使用JADE所以我不确定是否有办法创建可以调用的视图JSON.stringify(),但这就是我在JSP,velocity,ASP,PHP和Code Igniter中所做的事情(不使用JSON.stringify,而是使用它)给定语言的JSON工具)


Ins*_*hua 22

在ejs,它 <%- tagsJSON %>

          ^ <---- Note the "-"
Run Code Online (Sandbox Code Playgroud)


小智 11

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

{{ data|json|raw }}

  • 好的方法,如果你使用的是Swig. (2认同)

Zha*_*ang 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
Run Code Online (Sandbox Code Playgroud)

正如在 github 页面中提到的那样,但这不起作用,所以我去了文档并找到了这个:

http://paularmstrong.github.io/swig/docs/tags/

金子!:D

所以最终解决方案

{% autoescape false %}
var data = {{ data }}
{% endautoescape %}
Run Code Online (Sandbox Code Playgroud)