Cara menulis ke file JSON dalam format yang benar

111

Saya membuat hash di Ruby dan ingin menulisnya ke file JSON, dalam format yang benar.

Ini kode saya:

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

Dan berikut adalah isi dari file yang dihasilkan:

key_aval_akey_bval_b

Saya menggunakan Sinatra (tidak tahu versi apa) dan Ruby v 1.8.7.

Bagaimana saya bisa menulis ini ke file dalam format JSON yang benar?

dt1000
sumber
Lihat jawaban SO ini: stackoverflow.com/questions/1684588/…
Charlie Martin
Apa yang Anda lakukan sebenarnya adalah sesuatu yang sering saya gunakan untuk mendokumentasikan struktur JSON dan YAML yang saya gunakan. Saya akan menulis sepotong kecil kode untuk menyimpan YAML / JSON ke sebuah file, kemudian membangun struktur yang sama yang menunjukkan seperti apa datanya sebelum dan / atau setelah membuang dan memuat ulang. Jadi, meskipun kode Anda tidak berfungsi dengan baik, tetaplah dengan proses ini karena akan membuat hidup lebih mudah dalam jangka panjang.
Tin Man

Jawaban:

177

Memerlukan pustaka JSON , dan gunakan 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

File temp.json Anda sekarang terlihat seperti:

{"key_a":"val_a","key_b":"val_b"}
Mike Lewis
sumber
3
Perbaikan kecil: Saya menyarankan bentuk blok:File.open(...){ |f| f << h.to_json }
Phrogz
18
JSON.pretty_generate(tempHash)juga rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech
94

Dengan format

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

Keluaran

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Anders B
sumber
1
Saya suka opsi "a +". Tidak merusak data yang ada.
boulder_ruby
2
Menambahkan @boulder_ruby mungkin hanya masuk akal jika format file adalah JSONlines (satu objek JSON per baris) dan yang hampir tidak pernah digabungkan dengan baik pretty_generate, kecuali konsumen output adalah manusia. Meski begitu, lebih baik untuk membuat JSONlines dan menggunakan sesuatu seperti jquntuk melihat hasilnya.
Sim
11

Pertanyaan ini untuk ruby ​​1.8 tetapi masih menjadi yang teratas saat googling.

di ruby> = 1.9 Anda dapat menggunakan

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

Selain yang disebutkan di jawaban lain, di ruby ​​1.8 Anda juga bisa menggunakan satu bentuk liner

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

Untuk membuat ini berfungsi di Ubuntu Linux:

  1. Saya menginstal paket Ubuntu ruby-json:

    apt-get install ruby-json
  2. Aku menulis naskahnya ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc termasuk:

    ${HOME}/rubybin:${PATH}

(Pada kesempatan ini saya juga mengetik di atas pada baris perintah bash.)

Kemudian berfungsi ketika saya masuk pada baris perintah:

jsonDemo
daggett
sumber