Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js JavaScript字符串化_Node.js_Serialization_Stringify - Fatal编程技术网

Node.js JavaScript字符串化

Node.js JavaScript字符串化,node.js,serialization,stringify,Node.js,Serialization,Stringify,。我需要我的输出是100%有效的JavaScript;它将被这样评估——即,JSON。stringify不会(总是)满足我的需要 是否有用于节点的JavaScript字符串生成器 作为奖励,如果它能将对象字符串化,那就太好了。来自您链接的文章最后一段: 解决方案 幸运的是,解决方案很简单:如果我们查看JSON规范,我们会发现U+2028或U+2029唯一可能出现的地方是字符串。因此,只要我们需要发送一些JSONP,我们就可以简单地用\u2028(转义序列)替换每个U+2028,用\u2029替换

。我需要我的输出是100%有效的JavaScript;它将被这样评估——即,
JSON。stringify
不会(总是)满足我的需要

是否有用于节点的JavaScript字符串生成器


作为奖励,如果它能将对象字符串化,那就太好了。

来自您链接的文章最后一段:

解决方案

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

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


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

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

我读了那一段,但我不太明白
JSON.stringify('ro\u2028cks'.replace('\u2028','\\u2028')。replace('\u2029','\\u2029'))
给出了
“ro\\u2028cks”
——也就是说,它现在是双转义的。我不想重新实现整个
JSON.stringify
方法来实现这一点。@也不要给我打分-但是你可以发布一个关于unicode转义的更具体的问题,任何了解JS的人都可以帮助你,而不是只有节点开发人员可能在这方面有专业知识。@marknote我将作为一个单独的问题来做这件事;它们足够清晰,可能有比我所发布的更好的答案(理想情况下只是JSON解析器中封装此内容的功能。)@Mark您需要首先将其转换为JSON字符串,然后替换unicode字符:
JSON.stringify('ro\u2028cks')。替换('\u2028','\\u2028')。替换('\u2029','\\u2029'))
@Mark:实际上,这种替换是不够的;它将只替换每个字符的第一个匹配项。使用带有全局标志的regexp可以实现以下功能:
JSON.stringify('ro\u2028cks')。replace(/\u2028/g,'\\u2028')。replace(/\u2029/g,'\\u2029')