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?



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

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

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 }

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.