正しい形式でJSONファイルに書き込む方法


111

Rubyでハッシュを作成していますが、正しい形式でJSONファイルに書き込みたいのですが。

これが私のコードです:

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

そして、これが結果のファイルの内容です:

key_aval_akey_bval_b

私はSinatra(バージョンがわからない)とRuby v 1.8.7を使用しています。

これを正しいJSON形式でファイルに書き込むにはどうすればよいですか?



あなたがやっていることは、実際に私がよく使用するJSONおよびYAML構造を文書化するために使用するものです。YAML / JSONをファイルに保存する小さなコードを記述してから、同じ構造を構築して、ダンプとリロードの前後のデータを示します。したがって、コードは正しく機能していませんが、長期的に見れば生活が楽になるこのプロセスを使用してください。
ティンマン

回答:


177

JSONライブラリを必要とし、を使用します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

temp.jsonファイルは次のようになります。

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

3
マイナーな改善:ブロックフォームをお勧めします:File.open(...){ |f| f << h.to_json }
Phrogz

18
JSON.pretty_generate(tempHash)また、RADあるruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/...
コナーリーチ

94

フォーマットあり

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

出力

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

1
「a +」オプションが好きです。既存のデータを破壊しません。
boulder_ruby

2
@boulder_rubyの追加は、ファイル形式がJSONlines(1行に1つのJSONオブジェクト)である場合にのみ意味がpretty_generateあり、出力のコンシューマーが人間でない限り、とうまく結合することはほとんどありません。それでも、JSONlineを生成しjq、出力を表示するようなものを使用することをお勧めします。
Sim

11

この質問はruby 1.8に関するものですが、グーグル操作をするときにはまだトップです。

ruby> = 1.9では使用できます

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

他の回答で述べられているもの以外に、Ruby 1.8では1つのライナーフォームを使用することもできます

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

3

Ubuntu Linuxでこれを機能させるには:

  1. Ubuntuパッケージruby-jsonをインストールしました:

    apt-get install ruby-json
  2. 私は台本を書いた ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc 含まれる:

    ${HOME}/rubybin:${PATH}

(この際、bashコマンドラインで上記も入力しました。)

その後、コマンドラインで入力すると機能しました:

jsonDemo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.