Comment écrire dans un fichier JSON au format correct

111

Je crée un hachage dans Ruby et je souhaite l'écrire dans un fichier JSON, au format correct.

Voici mon code:

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

Et voici le contenu du fichier résultant:

key_aval_akey_bval_b

J'utilise Sinatra (je ne sais pas quelle version) et Ruby v 1.8.7.

Comment puis-je écrire ceci dans le fichier au format JSON correct?

dt1000
la source
Jetez un oeil à cette réponse SO: stackoverflow.com/questions/1684588/…
Charlie Martin
Ce que vous faites est en fait quelque chose que j'utilise beaucoup pour documenter les structures JSON et YAML que j'utilise. J'écrirai un petit morceau de code pour enregistrer le YAML / JSON dans un fichier, puis créerai les mêmes structures montrant à quoi devraient ressembler les données avant et / ou après le déchargement et le rechargement. Donc, bien que votre code ne fonctionne pas tout à fait correctement, tenez-vous-en à ce processus car il vous facilite la vie à long terme.
le Tin Man

Réponses:

177

Exigez la bibliothèque JSON et utilisez 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

Votre fichier temp.json ressemble maintenant à:

{"key_a":"val_a","key_b":"val_b"}
Mike Lewis
la source
3
Amélioration mineure: je suggère la forme de bloc:File.open(...){ |f| f << h.to_json }
Phrogz
18
JSON.pretty_generate(tempHash)est aussi rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech
95

Avec formatage

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

Production

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Anders B
la source
1
J'aime l'option "a +". Ne supprime pas les données existantes.
boulder_ruby
2
L'ajout de @boulder_ruby n'a de sens que si le format de fichier est JSONlines (un objet JSON par ligne) et que cela se combine rarement bien avec pretty_generate, à moins que le consommateur de la sortie soit un humain. Même dans ce cas, il est préférable de générer des lignes JSON et d'utiliser quelque chose comme jqpour voir la sortie.
Sim
11

Cette question est pour ruby ​​1.8, mais elle arrive toujours en tête lors de la recherche sur Google.

en rubis> = 1,9, vous pouvez utiliser

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

autre que ce qui est mentionné dans d'autres réponses, dans ruby ​​1.8, vous pouvez également utiliser une forme de doublure

File.open("public/temp.json","w"){ |f| f.write tempHash.to_json }
Haseeb Eqx
la source
3

Pour que cela fonctionne sur Ubuntu Linux:

  1. J'ai installé le package Ubuntu ruby-json:

    apt-get install ruby-json
  2. J'ai écrit le script en ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc inclus:

    ${HOME}/rubybin:${PATH}

(À cette occasion, j'ai également tapé ce qui précède sur la ligne de commande bash.)

Ensuite, cela a fonctionné lorsque je suis entré sur la ligne de commande:

jsonDemo
Daggett
la source