有没有办法阻止Ruby的JSON.pretty_generate()
方法转义Unicode字符?
我有一个JSON对象如下:
my_hash = {"my_str" : "\u0423"};
正在运行JSON.pretty_generate(my_hash)
会将值返回为\\u0423
。
有什么方法可以阻止这种行为吗?
答案 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在内部转义此字符,并且无法通过参数化JSON
或JSON.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。