Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
Ruby生成的JSON与JavaScript不兼容';s JSON解析器_Javascript_Ruby_Json - Fatal编程技术网

Ruby生成的JSON与JavaScript不兼容';s JSON解析器

Ruby生成的JSON与JavaScript不兼容';s JSON解析器,javascript,ruby,json,Javascript,Ruby,Json,我遇到了一个问题,Ruby脚本生成的JSON在JavaScriptsJSON.parse解析时不兼容。考虑下面的例子: # Ruby require 'json' hash = {} hash["key"] = "value with \u001a unicode" hash.to_json => '{"key":"value with \u001a unicode"}' // JavaScript JSON.parse('{"key":"value with \u001a unicod

我遇到了一个问题,Ruby脚本生成的JSON在JavaScripts
JSON.parse
解析时不兼容。考虑下面的例子:

# Ruby
require 'json'
hash = {}
hash["key"] = "value with \u001a unicode"
hash.to_json
=> '{"key":"value with \u001a unicode"}'

// JavaScript
JSON.parse('{"key":"value with \u001a unicode"}')
=> JSON.parse: bad control character in string literal at line 1 column 2 of the JSON data
问题是unicode字符
\u001a
。解决方法是将
\u001a
转义为
\\u001a
,但问题是,Ruby会自动将
\u001a
插入字符串中。我无法可靠地对结果进行后期处理。有没有办法解决这个问题


请注意,我希望在JavaScript执行环境中调用
JSON.parse
,而不是在Ruby的解释器中

下面的ruby代码为我提供了
“{\“key\”:\“value with\\u001a unicode\”}”
在输出方面

JSON.parse
也可以通过abel传递它。并根据以下公式给出
对象{key:“value with unicode”}

JSON文本以unicode编码。默认的unicode是utf-8

我在irb中运行了您的代码,得到了以下信息:

1.9.3-p484 :001 > require 'json'
 => true
1.9.3-p484 :002 >
1.9.3-p484 :003 >   hash = {}
 => {}
1.9.3-p484 :004 > hash["key"] = "value with \u001a unicode"
 => "value with \u001A unicode"
1.9.3-p484 :005 > hash.to_json
 => "{\"key\":\"value with \\u001a unicode\"}"
> JSON.parse("{\"key\":\"value with \\u001a unicode\"}")
> Object {key: "value with  unicode"}
然后在javascript控制台中运行返回的字符串,得到以下结果:

1.9.3-p484 :001 > require 'json'
 => true
1.9.3-p484 :002 >
1.9.3-p484 :003 >   hash = {}
 => {}
1.9.3-p484 :004 > hash["key"] = "value with \u001a unicode"
 => "value with \u001A unicode"
1.9.3-p484 :005 > hash.to_json
 => "{\"key\":\"value with \\u001a unicode\"}"
> JSON.parse("{\"key\":\"value with \\u001a unicode\"}")
> Object {key: "value with  unicode"}
它正在返回一个对象。要使用unicode获取值,必须通过调用访问哈希:

> str = JSON.parse("{\"key\":\"value with \\u001a unicode\"}")
> Object {key: "value with  unicode"}
> str.key
> "value with  unicode"

简短的版本是,在尝试将字符串解码为JSON之前,将其解释为Javascript表达式

U+001A是一个控制字符。这里的问题不是JSON无效,而是在试图将控制字符解析为JSON之前,您正在取消对它们的回避

当您从Ruby中转储字符串
“\u001a”
,并将其复制粘贴到Javascript解释器中时,转义序列将转换为未转义的控制字符,该字符在JSON中无效!非禁止字符工作正常-例如,您可以愉快地
JSON.parse('[“\u0020”]')

但是,如果您不将字符串解释为Javascript,而是将其作为原始字节读取,那么它将正确解析

$ irb
irb(main):001:0> require 'json'
=> true
irb(main):003:0> open("out.json", "w") {|f| f.print JSON.dump(["\u001a"]) }
=> nil

$ node -e 'require("fs").readFile("out.json", function(err, data) { console.log(JSON.parse(data)); });'
[ '\u001a' ]

如果要进行复制粘贴,则需要复制字符串的转义版本,以便在Javascript引擎解析字符串时,转义双转义序列正确地取消转义以转义序列而不是字符。因此,您不应该复制
JSON.dump([“\u001a”])
的输出,而应该复制
put JSON.dump([“\u001a”]).inspect的输出,这将正确地转义字符串中的任何转义序列。

我运行了您的代码,实际上我得到的是输出:
“{\'key\:\'value with\\u001a unicode\'}”
我也运行了您的代码,它运行得很好。您正在查看终端中的输出
\\u001a
是终端,是物理字符串
\u001a
。Ruby将反斜杠显示为\\,这样您就可以分辨出单个字符
\u001a
和同样写入的六个字符字符串
\u001a
之间的区别。另外请注意,应在JavaScript执行环境中调用
JSON.parse
,不是在Ruby解释器中,而是在终端中查看代码。它将转义显示字符串,以便您可以看到字符。否则,您如何区分
\\u001a
\u001a
之间的区别。因此
\\u001a
是不带unicode转义的文本字符串
\u001a
。要查看差异,请比较
“\\u001a”.size
“\u001a”.size
的结果。请注意,
\\u001a
的长度是6而不是7,这意味着Ruby显示的“`escape.JSON.parse应该在JavaScript执行环境中执行,而不是在Ruby的解释器中执行。@Max实际上,这也行得通。只是这些甚至是不同的语言!。。不管怎样。@D-side如果您想了解Ruby控制台输出工作的原因,请查看公认的答案。控制台输出不是调用
to_json
返回的确切字符串。@Max我知道。我以前在Ruby中转义shell命令时遇到过类似的问题。这里的一般规则是:知道何时以及多少次您的输入将被取消转义。有没有办法写出正确转义的字符串版本?我正在将字符串写入一个文件,然后其他人正在读取该文件并将该字符串复制到一个JavaScript文件中(以编程方式)。如果您使用JavaScript将其写入,
JSON.stringify(JSON\u string)
。如果您是用Ruby编写的,
JSON.dump(JSON\u string)