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.