Node.js JavaScript 字符串化

Posted

技术标签:

【中文标题】Node.js JavaScript 字符串化【英文标题】:Node.js JavaScript-stringify 【发布时间】:2013-04-06 23:19:32 【问题描述】:

JSON is not a subset of javascript。我需要我的输出是 100% 有效的 JavaScript;它将被如此评估 - 即,JSON.stringify 不会(总是)满足我的需求。

Node 有 JavaScript 字符串化器吗?

作为奖励,如果它可以对对象进行字符串化就好了。

【问题讨论】:

【参考方案1】:

您可以使用JSON.stringify,然后替换剩余的 U+2028 和 U+2029 字符。正如文章链接所述,字符只能出现在字符串中,因此我们可以安全地用它们的转义版本替换它们,而不必担心替换我们不应该替换它们的字符:

JSON.stringify('ro\u2028cks').replace(/\u2028/g,'\\u2028').replace(/\u2029/g,'\\u2029')

【讨论】:

【参考方案2】:

从您链接的文章的最后一段:

解决办法

幸运的是,解决方案很简单:如果我们查看 JSON 规范,我们会发现 U+2028 或 U+2029 可能出现的唯一位置是字符串。因此,每当我们需要发送一些 JSONP 时,我们可以简单地将每个 U+2028 替换为 \u2028(转义序列),并将 U+2029 替换为 \u2029。

它已经在 Rack::JSONP 中得到修复,我鼓励所有发送 JSONP 的框架或库也这样做。在大多数语言中它是一个单行补丁,结果仍然是 100% 有效的 JSON。

【讨论】:

我读过那一点,但我不太明白。 JSON.stringify('ro\u2028cks'.replace('\u2028','\\u2028').replace('\u2029','\\u2029')) 给出 "ro\\u2028cks" - 即,它现在是双重转义的。我不想重新实现整个 JSON.stringify 方法来完成此操作。 @Mark Me 两者都没有 - 但您可以发布一个更具体的关于 unicode 转义的问题,任何了解 JS 的人都可以帮助您解决问题,而不是只有节点开发人员可能有专业知识。 @Mark note 我会将此作为一个单独的问题;它们足够独特,并且可能有比我发布的更好的答案(理想情况下只是封装了这一点的 JSON 解析器中的一个功能。) @Mark 您需要先将其转换为 JSON 字符串,然后 然后 替换 unicode 字符:JSON.stringify('ro\u2028cks').replace('\u2028','\\u2028').replace('\u2029','\\u2029') @Mark:实际上,那个替换是不够的;它只会替换每个字符的第一次出现。使用带有全局标志的正则表达式可以解决问题:JSON.stringify('ro\u2028cks').replace(/\u2028/g,'\\u2028').replace(/\u2029/g,'\\u2029')

以上是关于Node.js JavaScript 字符串化的主要内容,如果未能解决你的问题,请参考以下文章

node.js

Node.js相关——CommonJS规范

JavaScript相关

准备:新V8即将到来,Node.js的性能正在改变

node+express搭建个人网站

如何在node.js“html页面”中显示json字符串化数组数据?