2011-06-27 40 views
5

有沒有什麼辦法可以防止Ruby的JSON.pretty_generate()方法逃脫Unicode字符?防止JSON pretty_generate轉義Unicode

我有一個JSON對象如下:

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

運行JSON.pretty_generate(my_hash)返回的值作爲\\u0423

有什麼辦法可以防止這種行爲?

+0

我不能重複這個問題。如果你在哈希語法中使用a:你必須使用ruby 1.9,並且我檢查的所有1.9.2-3執行正確的方式,正如DNNX在他的答案中所說的那樣。你可能會使用1.9.1,但(我沒有這個版本,因爲它從來沒有運行良好)。 1.8.7不起作用,似乎沒有解決方法。 – sunkencity

回答

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紅寶石寶石內部逃避這個角色是沒有辦法通過參數化的JSONJSON.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}" 

希望這有助於!

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 

紅寶石1.9.2p290,(內置)JSON 1.4.2。