Ruby JSON.pretty_generate … este destul de nepretențios (Programare, Ruby Pe Șine, Ruby, Json, Rubygems)

Amy a intrebat.

Se pare că nu reușesc să obțin JSON.pretty_generate() să genereze de fapt o ieșire frumoasă în Rails.

Folosesc Rails 2.3.5 și se pare că încarcă automat gemul JSON. Minunat. În timp ce folosesc script/console aceasta produce într-adevăr 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}"

Dar acest lucru nu produce o ieșire frumoasă:

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

Singura modalitate pe care am găsit-o pentru a o genera este de a utiliza irb și să încărcați versiunea „pură”:

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)
=> "{
  "cow": [
    1,
    2,
    3,
    4
  ],
  "moo": {
    "cat": "meow",
    "dog": "woof"
  },
  "foo": 1,
  "bar": 20
}"

DAR, ceea ce vreau cu adevărat este ca Rails să producă acest lucru. Are cineva vreun pont de ce nu pot face ca generatorul din Rails să funcționeze corect?

Mulțumesc!

Comentarii

  • @Amy, se pare că există unele inconsecvențe în exemplele tale. {"cow"=>[1, 2, 3, 4], ... nu este un JSON valid. JSON folosește : în loc de Ruby’s =>. Poți să lipești rezultatul real? –  > Por maček.
  • Îmi pare rău pentru asta. Am tăiat și lipit de pe un terminal unde am pus ieșirea printr-un puts(). Textul de mai sus este ieșirea exactă din script/console și irb. –  > Por Amy.
  • Ați putea explica cum obțineți a doua ieșire? (adică unde se află linia JSON.pretty_generate(some_data))).  > Por kikito.
  • @egarcia: Dacă intrați în consolă prin script/console și executați primul exemplu, apoi executați al doilea exemplu imediat după aceea ar trebui să facă acest lucru. Sau cel puțin pe calculatorul meu o face. Am încercat exemplele de mai sus doar cu versiunea 2.3.5; am observat pe o aplicație care rulează Rails versiunea 2.2.2 și în că biblioteca JSON nici măcar nu era încărcată („NameError: uninitialized constant JSON”). –  > Por Amy.
2 răspunsuri
Geoff Petrie

Pentru a genera o ieșire JSON frumoasă se pare că vă lipsește doar un puts apel.

Datele:

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

Doar apeluri JSON.pretty_generate:

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

  }
}"

Adăugarea unui puts în amestec:

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

Comentarii

  • Rezultatul pe care OP l-a furnizat nu conține nici o
    s, deci puts nu va schimba nimic. –  > Por Nowaker.
  • @DamianNowak Nu sunt sigur că înțeleg care este obiecția ta. În exemplul meu, folosesc aceeași intrare ca și cea specificată de OP și apoi demonstrez o ieșire destul de frumoasă prin utilizarea lui puts în irb. Ați putea să clarificați ce vreți să spuneți? –  > Por Geoff Petrie.
  • pretty_generate nu funcționează pentru OP. Nu există
    sau spații de indentare în rezultatul OP, după cum puteți vedea. Deci puts nu va schimba nimic. –  > Por Nowaker.
  • @Geoff Petrie Puteți vedea
    în prima parte a codului dvs. care nu se regăsesc în rezultatul lui OP. Acesta este motivul pentru care puts nu va schimba nimic pentru OP. –  > Por Konstantin.
Samuel

Folosesc Rails 2.3.8 și am instalat gemul JSON (gem install json). JSON.pretty_generate acum face frumos în 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)
=> "{
  "cow": [
    1,
    2,
    3,
    4
  ],
  "moo": {
    "cat": "meow",
    "dog": "woof"
  },
  "foo": 1,
  "bar": 20
}"

Comentarii

  • Du-te figura. Acum funcționează. De asemenea, am făcut recent actualizarea la 2.3.8. –  > Por Amy.
  • @Amy, nu înseamnă că acest răspuns ar trebui să fie cel acceptat? –  > Por Konstantin.