簡體   English   中英

防止JSON pretty_generate轉義Unicode

[英]Prevent JSON pretty_generate from escaping Unicode

有什么方法可以防止Ruby的JSON.pretty_generate()方法轉義Unicode字符嗎?

我有一個JSON對象,如下所示:

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

運行JSON.pretty_generate(my_hash)返回值為\\\У

有什么辦法可以防止這種行為?

在您的問題中,您有一個包含6個unicode字符的字符串"\\""u""0""4""2""3"my_hash = { "my_str" => '\У' } ),不是由1個"У"字符組成的字符串( "\У" ,請注意雙引號)。

根據RFC 4627第2.5段 ,必須對JSON字符串中的反斜杠字符進行轉義,這就是為什么從JSON.pretty_generate獲得雙反斜杠的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變體中獲取了此代碼(請注意, 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}"

希望這可以幫助!

通常,使用火箭=>而不是冒號:聲明的哈希。 此外,自1.9起,符號鍵哈希還存在其他語法: my_hash = {my_str: "\У"} 在這種情況下, :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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM