Max*_*wer 5 ruby unicode json utf-8
有没有办法阻止Ruby的JSON.pretty_generate()方法转义Unicode字符?
我有一个JSON对象如下:
my_hash = {"my_str" : "\u0423"};
Run Code Online (Sandbox Code Playgroud)
正在运行JSON.pretty_generate(my_hash)返回值\\u0423.
有什么方法可以防止这种行为吗?
在您的问题中,您有一个由 6 个 unicode 字符"\\", "u", "0", "4", "2", "3"( my_hash = { "my_str" => \'\\u0423\' }) 组成的字符串,而不是由 1 个字符组成的字符串"\xd0\xa3"("\\u0423",注意双引号)。
根据RFC 4627,第 2.5 段,JSON 字符串中的反斜杠字符必须转义,这就是为什么你从JSON.pretty_generate.
\n\n或者,还有
\n
一些流行字符的两个字符序列转义\n表示。因此,例如,
仅包含单个反斜线字符的字符串可以
更紧凑地表示为“\\\\”。
char = unescaped /\n escape (...\n %x5C / ; \\ reverse solidus U+005C\n\nescape = %x5C ; \\\nRun Code Online (Sandbox Code Playgroud)\n因此,JSON ruby gem 在内部转义此字符,并且无法通过参数化JSON或来改变此行为JSON.pretty_generate。
如果您对JSON gem 实现细节感兴趣- 它定义了带有 '\' 字符显式映射的内部映射哈希:
\nmodule JSON\n MAP = {\n ...\n \'\\\\\' => \'\\\\\\\\\'\nRun Code Online (Sandbox Code Playgroud)\n我从JSON gem 的纯 ruby 变体gem install json_pure中获取了此代码(请注意,还有由 分发的C 扩展变体gem install json)。
结论:如果您需要在 JSON 生成后取消转义反斜杠,则需要在应用程序逻辑中实现它,如上面的代码所示:
\nmy_hash = { "my_str" => \'\\u0423\' }\n# => {"my_str"=>"\\\\u0423"}\n\njson = JSON.pretty_generate(my_hash)\n# => "{\\n \\"my_str\\": \\"\\\\\\\\u0423\\"\\n}"\n\nres = json.gsub "\\\\\\\\", "\\\\"\n# => "{\\n \\"my_str\\": \\"\\\\u0423\\"\\n}"\nRun Code Online (Sandbox Code Playgroud)\n希望这可以帮助!
\n| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |