[英]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在內部轉義了此字符,並且無法通過參數化JSON
或JSON.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.