2010-04-02 12 views
18

Ich kann nicht scheinen, JSON.pretty_generate() zu bekommen, um wirklich schöne Ausgabe in Rails zu erzeugen.Ruby JSON.pretty_generate ... ist ziemlich unpretty

Ich benutze Rails 2.3.5 und es scheint automatisch das JSON Juwel zu laden. Genial. Während script/console mit dieser in der Tat JSON produziert:

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

Aber das ist nicht ziemlich Ausgang produziert:

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

Der einzige Weg, die ich gefunden habe zu generieren es irb zu bedienen und zu Laden Sie die "Pure" Version:

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

ABER, was ich wirklich will, ist Rails, um dies zu produzieren. Hat jemand irgendwelche Tipps, warum ich den Generator in Rails nicht richtig arbeiten kann?

Danke!

+0

@Amy scheint es einige Ungereimtheiten in Ihren Beispielen zu sein . '{" cow "=> [1, 2, 3, 4], ...' ist kein gültiger JSON. JSON verwendet ':' anstelle von Rubys '=>'. Können Sie die tatsächliche Ausgabe einfügen? –

+0

Entschuldigung. Ich habe aus einem Terminal, wo ich die Ausgabe durch ein Puts() gestellt hatte, Ausschneiden und Einfügen. Das obige ist die genaue Ausgabe von script/console und irb. – Amy

+0

Können Sie erklären, wie Sie die zweite Ausgabe bekommen? (d. h. wo ist die Zeile JSON.pretty_generate (some_data)) – kikito

Antwort

4

Ich benutze Rails 2.3.8 und installiert das JSON-Juwel (gem install json). JSON.pretty_generate jetzt tut gut in Skript/Konsole:

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

Gehen Sie Abbildung. Es funktioniert jetzt. Ich habe kürzlich auch auf 2.3.8 aufgerüstet. – Amy

+0

@Amy, bedeutet es nicht, dass diese Antwort die akzeptierte sein sollte? – Konstantin

17

ziemlich JSON Ausgabe zu erzeugen scheint es, dass Sie nur einen puts Anruf zu verpassen.

Die Daten:

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

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

ein puts in die Mischung hinzufügen:

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

Die Ausgabe, die OP zur Verfügung stellt, enthält keine '\ n's, so' puts' wird nichts ändern. – Nowaker

+0

@DamianNowak Ich bin mir nicht sicher, ob ich verstehe, was dein Einwand ist. In meinem Beispiel verwende ich die gleiche Eingabe wie das angegebene OP und zeige dann eine hübsche Ausgabe durch die Verwendung von 'puts' in irb. Könnten Sie bitte klarstellen, was Sie meinen? –

+3

'pretty_generate' funktioniert nicht für OP. Wie Sie sehen können, gibt es keine "\ n" oder Leerzeichen in der Ausgabe von OP. So wird 'puts' nichts verändern. – Nowaker