javascript - Ruby 生成的 JSON 与 JavaScript 的 JSON 解析器不兼容

标签 javascript ruby json

我遇到了一个问题,即由 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,但问题是,\u001a 会自动插入到字符串中 ruby 。我无法可靠地对结果进行后处理。关于如何解决这个问题的任何想法?

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

最佳答案

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

U+001A 是一个控制字符。 RFC 4627 explicitly disallows control characters U+0000-U+001F in quoted strings .您的问题不是 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"]) 的输出,不如复制 puts JSON.dump(["\u001a"]) 的输出。 inspect,这将正确转义字符串中的任何转义序列。

关于javascript - Ruby 生成的 JSON 与 JavaScript 的 JSON 解析器不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29857443/

相关文章:

javascript - 带有 JSON 数据的动态图表 - CanvasJS

javascript - Sonar 3.1 的 sonar-javascript-plugin 版本

objective-c - 排序 JSON 对象

json - 如何在 Gherkin 的场景大纲中使用类似文档字符串的内容?

ruby - stub 和模拟 Minitest

ruby-on-rails - 找不到 'id' =show 的用户

ruby - 具有双高清和 "space in name"错误的 RVM

javascript - 打开/关闭 div 切换并单击外部 div

javascript - 未捕获的不变违规 : addComponentAsRefTo(. ..):只有 ReactOwner 才能拥有引用

Javascript - 新方法