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

Posted

技术标签:

【中文标题】Node.js JSON.stringify() 在输出中导致“。无法使用 Jquery 解析【英文标题】:Node.js JSON.stringify() causing " in output. Can't parse with Jquery 【发布时间】:2012-06-24 05:41:35 【问题描述】:

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

有什么想法吗?

【问题讨论】:

您是否正在查看浏览器中的输出 "green":"title":"green","pagesContaining": "" ?如果您是,那么它已经为您进行了 HTML 编码。可能是因为pageprovider.findAllTag 对作为tagsJSONObj 参数传回的内容进行了HTML 编码。显示pageprovider.findAllTag的代码 search_tags.jade 长什么样子? 【参考方案1】:

这是因为当你打电话时

    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 中所做的(不使用 @ 987654326@,而是使用给定语言的 JSON 工具)

【讨论】:

谢谢。 !tagsJSON 工作得很好。我想用 JS 在客户端上重新创建我的数据集,这样我就可以使用该数据集轻松操作 DOM。我不想执行额外的 Ajax 请求来获取该数据。这就是为什么我想将我的 JSON obj 传递给视图内的 JS。这有意义吗? @JamisCharles 我明白了,您的视图不仅仅显示 JSON,那么 !tagsJSON 是正确的方式。 这是基于问题的正确答案(关键省略了视图代码),但是,我认为最好只将数据/对象传递给视图,并在那里进行字符串化操作.在您的翡翠模板中尝试!JSON.stringify(data)。这就是我决定的。【参考方案2】:

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

          ^ <---- Note the "-"

【讨论】:

可能很明显,但请注意 之后的 - 而不是 = 【参考方案3】:

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

data|json|raw

【讨论】:

好方法,如果您使用的是 Swig。 谢谢,我想知道如何在 swig 中解析 html 标签,现在我知道使用 safe 太棒了,解决了 ` | json_encode`不覆盖!【参考方案4】:

Swig 模板引擎方法:

由于没有提到 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 %

【讨论】:

以上是关于Node.js JSON.stringify() 在输出中导致“。无法使用 Jquery 解析的主要内容,如果未能解决你的问题,请参考以下文章

来自 MySQL 数据库的查询在 node.js 和 JSON.stringify() 中返回 [Object] [Object] 似乎不起作用

node.js JS对象和JSON字符串之间的转换

如何导入非 node.js 文件?

如何导入非 node.js 文件?

node.js怎样删除json数据

node.js 我需要能够创建一个全新的 JSON 文件