防止JSON pretty_generate转义Unicode

时间:2011-06-27 21:33:04

标签: ruby json unicode utf-8

有没有办法阻止Ruby的JSON.pretty_generate()方法转义Unicode字符?

我有一个JSON对象如下:

my_hash = {"my_str" : "\u0423"};

正在运行JSON.pretty_generate(my_hash)会将值返回为\\u0423

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

2 个答案:

答案 0 :(得分: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实现细节感兴趣,它会定义内部映射哈希,并使用'\'char显式映射:

module JSON
    MAP = {
        ...
        '\\'  =>  '\\\\'

我从JSON gem gem install json_pure纯ruby变种中获取此代码(请注意,还有{em> C扩展变体由{{1}分发}})。

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

gem install json

希望这有帮助!

答案 1 :(得分: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,(内置)json 1.4.2。