JSON dosyasına doğru formatta nasıl yazılır


111

Ruby'de bir karma oluşturuyorum ve bunu bir JSON dosyasına doğru biçimde yazmak istiyorum.

İşte kodum:

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

Ve işte ortaya çıkan dosyanın içeriği:

key_aval_akey_bval_b

Sinatra (hangi sürümü bilmiyorum) ve Ruby v 1.8.7 kullanıyorum.

Bunu doğru JSON formatında dosyaya nasıl yazabilirim?


Bu SO cevabına bir göz atın: stackoverflow.com/questions/1684588/…
Charlie Martin

Yaptığınız şey aslında kullandığım JSON ve YAML yapılarını belgelemek için çok kullandığım bir şey. YAML / JSON'u bir dosyaya kaydetmek için küçük bir kod parçası yazacağım, ardından verilerin dökümden ve yeniden yüklemeden önce ve / veya sonra nasıl görünmesi gerektiğini gösteren aynı yapıları oluşturacağım. Bu nedenle, kodunuz tam olarak doğru çalışmıyor olsa da, uzun vadede hayatı kolaylaştırdığı için bu işleme devam edin.
The Tin Man

Yanıtlar:


177

JSON kitaplığını gerekli kılın ve kullanın 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 dosyanız artık şöyle görünür:

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

3
Küçük iyileştirme: Blok şeklini öneriyorum:File.open(...){ |f| f << h.to_json }
Phrogz

18
JSON.pretty_generate(tempHash)aynı zamanda rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech

95

Biçimlendirme ile

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

Çıktı

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

1
"A +" seçeneğini beğendim. Mevcut verileri bozmaz.
boulder_ruby

2
@boulder_ruby eklenmesi, yalnızca dosya formatı JSONlines (satır başına bir JSON nesnesi) pretty_generateise ve çıktının tüketicisi bir insan olmadığı sürece neredeyse hiç iyi birleşmiyorsa mantıklı olabilir . O zaman bile, JSON hatları oluşturmak ve jqçıktıyı görmek gibi bir şey kullanmak daha iyidir .
Sim

11

Bu soru Ruby 1.8 içindir, ancak Google'da arama yaparken yine de zirveye çıkar.

yakut> = 1.9'da kullanabilirsiniz

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

Ruby 1.8'de diğer cevaplarda belirtilenlerin dışında, tek satırlık form da kullanabilirsiniz.

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

3

Bunun Ubuntu Linux'ta çalışmasını sağlamak için:

  1. Ruby-json Ubuntu paketini kurdum:

    apt-get install ruby-json
  2. Senaryoyu içine yazdım ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc dahil:

    ${HOME}/rubybin:${PATH}

(Bu vesileyle yukarıdakini bash komut satırına da yazdım.)

Sonra komut satırına girdiğimde çalıştı:

jsonDemo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.