2010-08-23 11 views
8

Este fragmento se emite una excepción:nil.to_json no se puede analizar de nuevo a nulo?

x = nil 
jsoned = x.to_json 
puts 'x.to_json=' + jsoned.inspect 
puts 'back=' + JSON.parse(jsoned).inspect 

C:/ruby/lib/ruby/1.9.1/json/common.rb:146:in `parse': 706: unexpected token at 'null'  (JSON::ParserError) 
x.to_json="null" 
from C:/ruby/lib/ruby/1.9.1/json/common.rb:146:in `parse' 
from C:/dev/prototyping/appoxy_app_engine/test/temp.rb:10:in `<top (required)>' 
from -e:1:in `load' 
from -e:1:in `<main>' 

es que el comportamiento esperado? ¿Pensaría que esto debería funcionar?

Respuesta

5

El problema no es específicamente con nil. Es que to_json en una cosa simple como nil o una sola cadena no produce una representación JSON completa.

p. Ej. algo así como JSON.parse("hello".to_json) produciría resultados similares

Si tenemos un Hash con nil para uno de sus valores se codificar y decodificar correctamente:

>> h = {"name"=>"Mike", "info"=>nil} 
=> {"name"=>"Mike", "info"=>nil} 
>> h.to_json 
=> "{\"name\":\"Mike\",\"info\":null}" 
>> JSON.parse(h.to_json) 
=> {"name"=>"Mike", "info"=>nil} 
+9

usted no tiene, por sí mismo, responde a la pregunta. ¿To_json produce incorrectamente JSON "no válido" o JSON.parse falla al analizar JSON "válido"? De cualquier manera, esto no debería ser un comportamiento esperado dentro de ruby. Esperaría serializar/deserializar para ser coherente entre sí, independientemente del medio subyacente. – ghayes

+1

Ninguno: to_json produce correctamente JSON no válido. Cuando llama a jjson en un único valor como nil, en realidad está diciendo "Muéstreme cómo se representaría este valor como un valor JSON". Eso es algo sensato que hacer en algunos casos, pero un valor que no sea objeto y que no sea un array aún no es un texto JSON válido. –

1

JSON no le gustan los objetos individuales, es realmente para serializar colecciones de objetos Si prueba algo como esto, puede ver que realmente genera JSON válido para objetos nulos y puede deserializarlos.

n = JSON.parse(JSON.generate([nil])) # => [nil] 
+1

En Ruby, Array y Nil son ambos objetos. – weexpectedTHIS

14

El analizador JSON tiene un "modo peculiar" en el que se analizarán los valores JSON individuales.

>> nil.to_json 
=> "null" 
>> JSON.parse("null", {:quirks_mode => true}) 
=> nil 

También funciona para otros valores individuales:

>> JSON.parse("12", {:quirks_mode => true}) 
=> 12 
>> JSON.parse("true", {:quirks_mode => true}) 
=> true 
>> JSON.parse(" \"string\" ", {:quirks_mode => true}) 
=> "string" 
+3

¿Por qué Ruby JSON lib no convierte a quirks_mode en su modo predeterminado? ¿Tiene quirks_mode algún resultado de análisis especial? ¿Tiene quirks_mode significa modo predeterminado + único analizador de valores JSON? – agate

+2

El nivel superior de un texto JSON debe ser un objeto '{}' o una matriz '[]'. Los valores individuales incluidos anteriormente no son ni objetos ni matriz, y por lo tanto no son textos JSON, interpretados estrictamente. El modo Quirks permite analizar valores únicos como los anteriores: no es el valor predeterminado porque maneja un caso no estándar. –

Cuestiones relacionadas