2010-04-02 5 views
18

Non riesco a ottenere lo JSON.pretty_generate() per generare effettivamente un buon output in Rails.Ruby JSON.pretty_generate ... è piuttosto unpretty

Uso Rails 2.3.5 e sembra che venga caricato automaticamente il gioiello JSON. Eccezionale. Durante l'utilizzo di questo script/console effettivamente produce 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}" 

Ma questo non produce abbastanza uscita:

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

L'unico modo che ho trovato per generarlo è quello di utilizzare irb e per caricare la versione "Pure":

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

MA, quello che voglio è Rails per produrre questo. Qualcuno ha qualche consiglio perché non riesco a far funzionare correttamente il generatore in Rails?

Grazie!

+0

@Amy, sembra che ci sia alcune incongruenze nei tuoi esempi . '{" cow "=> [1, 2, 3, 4], ...' non è un JSON valido. JSON usa ':' al posto di Ruby '=>'. Puoi incollare l'output effettivo? –

+0

Mi dispiace per quello. Stavo tagliando e incollando da un terminale dove avevo messo l'output attraverso un puts(). Quanto sopra è l'output esatto da script/console e irb. – Amy

+0

Puoi spiegare come ottieni la seconda uscita? (Ad esempio, dove è la riga JSON.pretty_generate (some_data)) – kikito

risposta

4

Uso Rails 2.3.8 e installato la gemma JSON (gem install json). JSON.pretty_generate ora fa bene in script/console:

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

Vai alla figura. Ora funziona. Ho anche recentemente aggiornato a 2.3.8. – Amy

+0

@Amy, non significa che questa risposta dovrebbe essere accettata? – Konstantin

17

per generare l'output JSON piuttosto sembra che vi state perdendo solo una chiamata puts.

I dati:

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

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

L'aggiunta di un puts nel mix:

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

L'output fornito da OP non contiene '\ n's, quindi' puts' non cambierà nulla. – Nowaker

+0

@DamianNowak Non sono sicuro di capire qual è la tua obiezione. Nel mio esempio sto usando lo stesso input dell'OP specificato e quindi sto dimostrando un bel risultato attraverso l'uso di 'puts' in irb. Potresti per favore chiarire cosa intendi? –

+3

'pretty_generate' non funziona per OP. Non ci sono spazi '\ n' o rientro nell'output dell'OP, come puoi vedere. Quindi 'puts' non cambierà nulla. – Nowaker