2010-04-02 8 views
18

Parece que no puedo obtener JSON.pretty_generate() para realmente generar una salida bonita en Rails.Ruby JSON.pretty_generate ... es bastante poco agradable

Estoy usando Rails 2.3.5 y parece cargar automáticamente la joya JSON. Increíble. Durante el uso de este script/console produce de hecho JSON:

some_data = {'foo' => 1, 'bar' => 20, 'cow' => [1, 2, 3, 4], 'moo' => {'dog' => 'woof', 'cat' => 'meow'}} 
some_data.to_json 
=> "{\"cow\":[1,2,3,4],\"moo\":{\"cat\":\"meow\",\"dog\":\"woof\"},\"foo\":1,\"bar\":20}" 

Pero esto no produce bastante de salida:

JSON.pretty_generate(some_data) 
=> "{\"cow\":[1,2,3,4],\"moo\":{\"cat\":\"meow\",\"dog\":\"woof\"},\"foo\":1,\"bar\":20}" 

La única forma que he encontrado para generarlo es utilizar irb ya cargar la versión "pura":

require 'rubygems' 
require 'json/pure' 
some_data = {'foo' => 1, 'bar' => 20, 'cow' => [1, 2, 3, 4], 'moo' => {'dog' => 'woof', 'cat' => 'meow'}} 
JSON.pretty_generate(some_data) 
=> "{\n \"cow\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"moo\": {\n \"cat\": \"meow\",\n \"dog\": \"woof\"\n },\n \"foo\": 1,\n \"bar\": 20\n}" 

PERO, lo que realmente quiero es que Rails produzca esto. ¿Alguien tiene alguna sugerencia de por qué no puedo hacer que el generador en Rails funcione correctamente?

Gracias!

+0

@Amy, parece que hay algunas inconsistencias en los ejemplos . '{" cow "=> [1, 2, 3, 4], ...' no es válido JSON. JSON usa ':' en lugar de '=>' de Ruby. ¿Puedes pegar la salida real? –

+0

Perdón por eso. Estaba cortando y pegando desde un terminal donde había puesto la salida a través de puts(). Lo anterior es el resultado exacto de script/console e irb. – Amy

+0

¿Podría explicar cómo obtiene la segunda salida? (es decir, ¿dónde está la línea JSON.pretty_generate (some_data)) – kikito

Respuesta

4

Uso Rails 2.3.8 e instalé la gema JSON (gem install json). JSON.pretty_generate ahora lo hace muy bien en escritura/consola:

>> some_data = {'foo' => 1, 'bar' => 20, 'cow' => [1, 2, 3, 4], 'moo' => {'dog' => 'woof', 'cat' => 'meow'}} 
=> {"cow"=>[1, 2, 3, 4], "moo"=>{"cat"=>"meow", "dog"=>"woof"}, "foo"=>1, "bar"=>20} 
>> JSON.pretty_generate(some_data) 
=> "{\n \"cow\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"moo\": {\n \"cat\": \"meow\",\n \"dog\": \"woof\"\n },\n \"foo\": 1,\n \"bar\": 20\n}" 
+0

Ve la figura. Ahora funciona. También recientemente actualicé a 2.3.8. – Amy

+0

@Amy, ¿no significa que esta respuesta debería ser la aceptada? – Konstantin

17

para generar la salida JSON bonito que parece que sólo se está perdiendo una llamada puts.

Los datos:

some_data = {'foo' => 1, 'bar' => 20, 'cow' => [1, 2, 3, 4], 'moo' => {'dog' => 'woof', 'cat' => 'meow'}} 

Calling única JSON.pretty_generate:

> JSON.pretty_generate some_data 
=> "{\n \"foo\": 1,\n \"bar\": 20,\n \"cow\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"moo\": {\n \"dog\": \"woof\",\n \"cat\": \"meow\"\n }\n}" 

Adición de un puts en la mezcla:

> puts JSON.pretty_generate some_data 
{ 
    "foo": 1, 
    "bar": 20, 
    "cow": [ 
    1, 
    2, 
    3, 
    4 
    ], 
    "moo": { 
    "dog": "woof", 
    "cat": "meow" 
    } 
} 
+3

La salida que OP proporcionó no contiene ningún '\ n's, por lo que' puts' no va a cambiar nada. – Nowaker

+0

@DamianNowak No estoy seguro de entender su objeción. En mi ejemplo, estoy usando la misma entrada que el OP especificado y luego demostrando la salida bonita mediante el uso de 'puts' en irb. ¿Podría aclarar a qué se refiere? –

+3

'pretty_generate' no funciona para OP. No hay '\ n' ni espacios de sangría en la salida de OP, como puede ver. Entonces 'puts' no va a cambiar nada. – Nowaker

Cuestiones relacionadas