防止JSON pretty_generate转义Unicode

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.

有什么方法可以防止这种行为吗?

Ali*_*kau 4

在您的问题中,您有一个由 6 个 unicode 字符"\\", "u", "0", "4", "2", "3"( my_hash = { "my_str" => \'\\u0423\' }) 组成的字符串,而不是由 1 个字符组成的字符串"\xd0\xa3""\\u0423",注意双引号)。

\n

根据RFC 4627,第 2.5 段,JSON 字符串中的反斜杠字符必须转义,这就是为什么你从JSON.pretty_generate.

\n
\n

或者,还有
一些流行字符的两个字符序列转义\n表示。因此,例如,
仅包含单个反斜线字符的字符串可以
更紧凑地表示为“\\\\”。

\n
\n
char = unescaped /\n       escape (...\n           %x5C /          ; \\    reverse solidus U+005C\n\nescape = %x5C              ; \\\n
Run Code Online (Sandbox Code Playgroud)\n

因此,JSON ruby​​ gem 在内部转义此字符,并且无法通过参数化JSON或来改变此行为JSON.pretty_generate

\n

如果您对JSON gem 实现细节感兴趣- 它定义了带有 '\' 字符显式映射的内部映射哈希:

\n
module JSON\n    MAP = {\n        ...\n        \'\\\\\'  =>  \'\\\\\\\\\'\n
Run Code Online (Sandbox Code Playgroud)\n

我从JSON gem 的纯 ruby​​ 变体gem install json_pure中获取了此代码(请注意,还有由 分发的C 扩展变体gem install json)。

\n

结论:如果您需要在 JSON 生成后取消转义反斜杠,则需要在应用程序逻辑中实现它,如上面的代码所示:

\n
my_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}"\n
Run Code Online (Sandbox Code Playgroud)\n

希望这可以帮助!

\n