2011-06-27 17 views
5

Ruby'nin JSON.pretty_generate() yönteminin Unicode karakterinden kaçmasını engellemenin bir yolu var mı?JSON pretty_generate öğesini çıkıştan engelle Unicode

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

JSON.pretty_generate(my_hash) döner \\u0423 olarak değerinin Geçen aşağıdaki gibidir:

bir JSON nesnesi sahiptir.

Bu davranışı engellemenin bir yolu var mı?

+0

Bu sorunu tekrarlayamıyorum. Eğer hash sözdizimini a: ile kullanıyorsanız, ruby ​​1.9'u kullanmalısınız ve kontrol ettiğim 1.9.2-3'lerin tümü, DNNX'in cevabında yazdığı gibi doğru yolu gerçekleştirmelidir. Yine de 1.9.1 kullanıyor olabilirsiniz (o kadar iyi çalışmadığı için o versiyona sahip değilim). 1.8.7 çalışmıyor ve bunun için bir çözüm yok gibi görünüyor. – sunkencity

cevap

4

Eğer 6 unicode karakterleri "\", bir ipe sahip "u", "0", "4", "2", "3" (my_hash = { "my_str" => '\u0423' }) değil, 1 "У" karakteri oluşan bir dize ("\u0423", çift tırnak dikkat edin). senin JSON.pretty_generate gelen çift ters eğik çizgi olsun neden RFC 4627, 2.5 JSON dizesinde ters eğik çizgi karakteri şekilde çıkmalıdır paragraf uyarınca

, bu.

Alternatif iki karakter dizisini bazı popüler karakterlerden
temsillerini kaçış vardır. Örneğin, sadece bir tek ters katı karakter içeren bir
dizgisi "\\" olarak daha yoğun olarak temsil edilen
olabilir.

char = unescaped/
     escape (... 
      %x5C/  ; \ reverse solidus U+005C 

escape = %x5C    ; \ 

Böylece JSON yakut mücevher içten bu kaçış karakteri ve JSON veya JSON.pretty_generate parametrizasyonunu bu davranışı değiştirmek için bir yolu yoktur.

module JSON 
    MAP = { 
     ... 
     '\\' => '\\\\' 

JSON bir saf yakut varyantı gelen bu kodu aldı: o '\' char açık eşleştirme ile iç haritalama karma tanımlar - Eğer JSON mücevher uygulama ayrıntıları ilgileniyorsanız

gem gem install json_pure (gem install json tarafından dağıtılan C uzantı varyantı vardır).

Sonuç: Eğer yukarıdaki kodda olduğu gibi başvurunuzun mantığında uygulamak gerekir JSON Üretiminde kömür sonra ters eğik çizgi okunabilir hale getirmek için gerekirse: Bu yardımcı olur

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}" 

Umut!

2

Genellikle sağlama işaretleri, : numaralı kolon yerine roket => kullanılarak bildirilmiştir. Ayrıca, sembol anahtarlı karmalar için 1.9: my_hash = {my_str: "\u0423"}'dan itibaren alternatif bir sözdizimi vardır. Bu durumda, :my_str anahtar olacaktır.

Neyse, beklendiği gibi çalıştığını JSON.pretty_generate bilgisayarımda:

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, (built-in) json 1.4.2. Sorunuza olarak

İlgili konular