防止JSON pretty_generate转义Unicode

5
有没有办法防止Ruby的JSON.pretty_generate()方法转义Unicode字符?
我有一个JSON对象如下:
my_hash = {"my_str" : "\u0423"};

运行JSON.pretty_generate(my_hash)返回的值为\\u0423

是否有任何方法可以防止这种行为?


我无法重复这个问题。如果您正在使用带有“:”的哈希语法,则必须使用Ruby 1.9,并且我检查过的所有1.9.2-3都像DNNX在他的答案中所说的那样正确执行。但是您可能正在使用1.9.1(我没有该版本,因为它从未正常工作)。1.8.7不起作用,似乎也没有解决方法。 - sunkencity
2个回答

4
在你的问题中,你有一个由6个unicode字符组成的字符串"\", "u", "0", "4", "2", "3" (my_hash = { "my_str" => '\u0423' }),而不是由1个"У"字符组成的字符串("\u0423",注意双引号)。
根据RFC 4627第2.5段规定,在JSON字符串中反斜杠字符必须转义,这就是为什么你从JSON.pretty_generate得到了双反斜杠的原因。

或者,一些常见字符有两个字符的序列转义表示。例如,只包含一个反斜杠字符的字符串可以更紧凑地表示为"\\"。

char = unescaped /
       escape (...
           %x5C /          ; \    reverse solidus U+005C

escape = %x5C              ; \

因此,JSON ruby gem 内部转义该字符,并且无法通过参数化JSONJSON.pretty_generate来更改此行为。
如果您对 JSON gem 实现细节 感兴趣 - 它定义了带有显式映射 '' 字符的内部映射哈希。
module JSON
    MAP = {
        ...
        '\\'  =>  '\\\\'

我从JSON宝石的纯Ruby变体中获取了这段代码gem install json_pure(请注意,还有一个由gem install json分发的C扩展变体)。
结论:如果您需要在生成JSON后取消转义反斜杠,则需要在应用程序逻辑中实现它,就像上面的代码一样。
my_hash = { "my_str" => '\u0423' }
# => {"my_str"=>"\\u0423"}

json = JSON.pretty_generate(my_hash)
# => "{\n  \"my_str\": \"\\\\u0423\"\n}"

res = json.gsub "\\\\", "\\"
# => "{\n  \"my_str\": \"\\u0423\"\n}"

希望这能帮到您!

2
通常,哈希使用火箭符号=>声明,而不是冒号:。自1.9以来,有一种用于符号键哈希的替代语法:my_hash = {my_str: "\u0423"}。在这种情况下,:my_str将是键。无论如何,在我的计算机上,JSON.pretty_generate按预期工作:
irb(main):002:0> my_hash = {"my_str" => "\u0423"}
=> {"my_str"=>"У"}
irb(main):003:0> puts JSON.pretty_generate(my_hash)
{
  "my_str": "У"
}
=> nil

Ruby 1.9.2p290, (built-in) json 1.4.2.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接