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?


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

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

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 }

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.