Come scrivere su un file JSON nel formato corretto


111

Sto creando un hash in Ruby e voglio scriverlo su un file JSON, nel formato corretto.

Ecco il mio codice:

tempHash = {
    "key_a" => "val_a",
    "key_b" => "val_b"
}
fJson = File.open("public/temp.json","w")
fJson.write(tempHash)
fJson.close

Ed ecco il contenuto del file risultante:

key_aval_akey_bval_b

Sto usando Sinatra (non so quale versione) e Ruby v 1.8.7.

Come posso scrivere questo nel file nel formato JSON corretto?


Dai un'occhiata a questa risposta SO: stackoverflow.com/questions/1684588/…
Charlie Martin

Quello che stai facendo è in realtà qualcosa che uso molto per documentare le strutture JSON e YAML che uso. Scriverò un piccolo pezzo di codice per salvare YAML / JSON in un file, quindi costruirò le stesse strutture che mostrano come dovrebbero apparire i dati prima e / o dopo il dumping e il ricaricamento. Quindi, anche se il tuo codice non funziona correttamente, segui questo processo in quanto ti semplifica la vita a lungo termine.
Tin Man

Risposte:


177

Richiedi la libreria JSON e usa to_json.

require 'json'
tempHash = {
    "key_a" => "val_a",
    "key_b" => "val_b"
}
File.open("public/temp.json","w") do |f|
  f.write(tempHash.to_json)
end

Il tuo file temp.json ora ha il seguente aspetto:

{"key_a":"val_a","key_b":"val_b"}

3
Miglioramento minore: suggerisco il modulo di blocco:File.open(...){ |f| f << h.to_json }
Phrogz

18
JSON.pretty_generate(tempHash)è anche rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech

94

Con formattazione

require 'json'
tempHash = {
    "key_a" => "val_a",
    "key_b" => "val_b"
}
File.open("public/temp.json","w") do |f|
  f.write(JSON.pretty_generate(tempHash))
end

Produzione

{
    "key_a":"val_a",
    "key_b":"val_b"
}

1
Mi piace l'opzione "a +". Non blocca i dati esistenti.
boulder_ruby

2
L'aggiunta di @boulder_ruby può avere senso solo se il formato del file è JSONlines (un oggetto JSON per riga) e che difficilmente si combina bene con pretty_generate, a meno che il consumatore dell'output non sia un essere umano. Anche in questo caso, è meglio generare linee JSON e utilizzare qualcosa di simile jqper vedere l'output.
Sim

11

Questa domanda è per Ruby 1.8, ma è ancora in primo piano quando si cerca su Google.

in ruby> = 1.9 puoi usare

File.write("public/temp.json",tempHash.to_json)

oltre a quanto menzionato in altre risposte, in ruby ​​1.8 puoi anche usare un modulo di linea

File.open("public/temp.json","w"){ |f| f.write tempHash.to_json }

3

Per farlo funzionare su Ubuntu Linux:

  1. Ho installato il pacchetto Ubuntu ruby-json:

    apt-get install ruby-json
  2. Ho scritto la sceneggiatura in formato ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc incluso:

    ${HOME}/rubybin:${PATH}

(In questa occasione ho anche digitato quanto sopra sulla riga di comando di bash.)

Quindi ha funzionato quando sono entrato nella riga di comando:

jsonDemo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.