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 字符串化的主要内容,如果未能解决你的问题,请参考以下文章