有沒有什麼辦法可以防止Ruby的JSON.pretty_generate()
方法逃脫Unicode字符?防止JSON pretty_generate轉義Unicode
我有一個JSON對象如下:
my_hash = {"my_str" : "\u0423"};
運行JSON.pretty_generate(my_hash)
返回的值作爲\\u0423
。
有什麼辦法可以防止這種行爲?
有沒有什麼辦法可以防止Ruby的JSON.pretty_generate()
方法逃脫Unicode字符?防止JSON pretty_generate轉義Unicode
我有一個JSON對象如下:
my_hash = {"my_str" : "\u0423"};
運行JSON.pretty_generate(my_hash)
返回的值作爲\\u0423
。
有什麼辦法可以防止這種行爲?
在你的問題,你有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紅寶石寶石內部逃避這個角色是沒有辦法通過參數化的JSON
或JSON.pretty_generate
改變這種行爲。
如果您有興趣JSON創業板實施細則 - 它定義了內部映射哈希以「\」字符的顯式映射:
module JSON
MAP = {
...
'\\' => '\\\\'
我把這個代碼從JSON的純Ruby變種 gem gem install json_pure
(注意,也有C擴展變體,其由gem install json
分佈)。
結論:如果您需要取消轉義JSON genaration之後反斜槓,你需要實現它在你的應用程序邏輯,就像在上面的代碼:
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}"
希望這有助於!
通常,散列聲明使用火箭=>
而不是冒號:
。此外,自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
紅寶石1.9.2p290,(內置)JSON 1.4.2。
我不能重複這個問題。如果你在哈希語法中使用a:你必須使用ruby 1.9,並且我檢查的所有1.9.2-3執行正確的方式,正如DNNX在他的答案中所說的那樣。你可能會使用1.9.1,但(我沒有這個版本,因爲它從來沒有運行良好)。 1.8.7不起作用,似乎沒有解決方法。 – sunkencity