So schreiben Sie in eine JSON-Datei im richtigen Format

111

Ich erstelle einen Hash in Ruby und möchte ihn im richtigen Format in eine JSON-Datei schreiben.

Hier ist mein Code:

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

Und hier ist der Inhalt der resultierenden Datei:

key_aval_akey_bval_b

Ich verwende Sinatra (weiß nicht welche Version) und Ruby v 1.8.7.

Wie kann ich dies im richtigen JSON-Format in die Datei schreiben?

dt1000
quelle
Schauen Sie sich diese SO-Antwort an: stackoverflow.com/questions/1684588/…
Charlie Martin
Was Sie tun, verwende ich häufig, um die von mir verwendeten JSON- und YAML-Strukturen zu dokumentieren. Ich schreibe einen kleinen Code, um YAML / JSON in einer Datei zu speichern, und erstelle dann dieselben Strukturen, die zeigen, wie die Daten vor und / oder nach dem Dumping und Neuladen aussehen sollen. Also, obwohl Ihr Code nicht ganz richtig funktioniert, bleiben Sie bei diesem Prozess, da er das Leben auf lange Sicht einfacher macht.
der Blechmann

Antworten:

177

Benötigen Sie die JSON- Bibliothek und verwenden Sie 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

Ihre temp.json-Datei sieht jetzt so aus:

{"key_a":"val_a","key_b":"val_b"}
Mike Lewis
quelle
3
Kleinere Verbesserung: Ich schlage die Blockform vor:File.open(...){ |f| f << h.to_json }
Phrogz
17
JSON.pretty_generate(tempHash)ist auch rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech
94

Mit Formatierung

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

Ausgabe

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Anders B.
quelle
1
Ich mag die Option "a +". Verstopft keine vorhandenen Daten.
boulder_ruby
2
Das Anhängen von @boulder_ruby ist möglicherweise nur dann sinnvoll, wenn das Dateiformat JSONlines (ein JSON-Objekt pro Zeile) ist und sich kaum gut damit kombinieren lässt pretty_generate, es sei denn, der Verbraucher der Ausgabe ist ein Mensch. Selbst dann ist es besser, JSONlines zu generieren und so etwas wie jqdie Ausgabe zu sehen.
Sim
11

Diese Frage bezieht sich auf Ruby 1.8, kommt aber beim Googeln immer noch an die Spitze.

in ruby> = 1.9 können Sie verwenden

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

Anders als in anderen Antworten erwähnt, können Sie in Ruby 1.8 auch eine Liner-Form verwenden

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

So funktioniert dies unter Ubuntu Linux:

  1. Ich habe das Ubuntu-Paket ruby-json installiert:

    apt-get install ruby-json
  2. Ich habe das Drehbuch geschrieben ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc inbegriffen:

    ${HOME}/rubybin:${PATH}

(Bei dieser Gelegenheit habe ich auch das Obige in die Bash-Befehlszeile eingegeben.)

Dann hat es funktioniert, als ich in die Kommandozeile eingegeben habe:

jsonDemo
daggett
quelle