2011-06-27 14 views
5

¿Hay alguna manera de evitar que el método JSON.pretty_generate() de Ruby escape de un carácter Unicode?Evite que JSON pretty_generate escape Unicode

Tengo un objeto JSON como sigue:

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

Correr JSON.pretty_generate(my_hash) devuelve el valor como \\u0423.

¿Hay alguna manera de evitar este comportamiento?

+0

No puedo repetir este problema. Si está usando la sintaxis hash con a: debe estar usando ruby ​​1.9, y todos los 1.9.2-3 con los que controlo funcionan de la manera correcta como dice DNNX aquí en su respuesta. Puede que estés usando 1.9.1 (no tengo esa versión porque nunca funcionó bien). 1.8.7 no funciona, y parece que no hay una solución para eso. – sunkencity

Respuesta

4

En su pregunta usted tiene una cadena de 6 caracteres Unicode "\", "u", "0", "4", "2", "3" (my_hash = { "my_str" => '\u0423' }), no es una cadena que consta de 1 "У" carácter ("\u0423", tenga en cuenta las comillas dobles).

Según RFC 4627, párrafo 2.5, barra invertida en la cadena JSON debe ser escapado, esta es la razón por su obtener el doble barra invertida de JSON.pretty_generate.

otra parte, hay secuencia de dos caracteres de escape
representaciones de algunos personajes populares. Por lo tanto, por ejemplo, una cadena
que contiene un solo carácter solidus inverso puede ser
representada de manera más compacta como "\\".

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

escape = %x5C    ; \ 

Así JSON gema de rubíes escapar este carácter interno y no hay manera de alterar este comportamiento mediante parametrización JSON o JSON.pretty_generate.

Si usted está interesado en JSON detalles de implementación joya - se define hash de asignación interna con asignación explícita de '\' Char:

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

Tomé el código de una variante de rubí puro de JSON gem gem install json_pure (tenga en cuenta que también hay variante de extensión C que se distribuye por gem install json).

Conclusión: Si necesita unescape barra invertida después de JSON genaration que necesita para ponerlo en práctica en su lógica de la aplicación, al igual que en el código anterior:

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

Espero que esto ayude!

2

Por lo general, los hash declarados con cohete => en lugar de colon :. Además, existe una sintaxis alternativa para hashes con clave de símbolo desde 1.9: my_hash = {my_str: "\u0423"}. En este caso, :my_str sería la clave.

De todos modos, en mi equipo JSON.pretty_generate funciona como se esperaba:

irb(main):002:0> my_hash = {"my_str" => "\u0423"} 
=> {"my_str"=>"У"} 
irb(main):003:0> puts JSON.pretty_generate(my_hash) 
{ 
    "my_str": "У" 
} 
=> nil 

Rubí 1.9.2p290, JSON 1.4.2 (built-in).

Cuestiones relacionadas