วิธีเขียนลงไฟล์ 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 ที่ถูกต้องได้อย่างไร


ดูคำตอบ SO นี้: stackoverflow.com/questions/1684588/…
Charlie Martin

สิ่งที่คุณกำลังทำนั้นเป็นสิ่งที่ฉันใช้มากในการบันทึกโครงสร้าง JSON และ YAML ที่ฉันใช้ ฉันจะเขียนโค้ดชิ้นเล็ก ๆ เพื่อบันทึก YAML / JSON ลงในไฟล์จากนั้นสร้างโครงสร้างเดียวกันที่แสดงว่าข้อมูลควรมีลักษณะอย่างไรก่อนและ / หรือหลังการถ่ายโอนข้อมูลและการโหลดซ้ำ ดังนั้นแม้ว่ารหัสของคุณจะทำงานไม่ถูกต้อง แต่ให้ปฏิบัติตามขั้นตอนนี้เพราะจะทำให้ชีวิตง่ายขึ้นในระยะยาว
The Tin Man

คำตอบ:


177

ต้องJSONto_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/…
Connor Leech

95

ด้วยการจัดรูปแบบ

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 (ออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด) และแทบจะไม่เคยรวมเข้าด้วยกันได้ดีpretty_generateเว้นแต่ผู้บริโภคของผลลัพธ์จะเป็นมนุษย์ แม้ว่าจะเป็นการดีกว่าที่จะสร้าง JSONlines และใช้สิ่งที่ต้องการjqเพื่อดูผลลัพธ์
ซิม

11

คำถามนี้มีไว้สำหรับ Ruby 1.8 แต่ยังคงอยู่ด้านบนเมื่อ googling

ในทับทิม> = 1.9 คุณสามารถใช้ได้

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

นอกเหนือจากที่กล่าวถึงในคำตอบอื่น ๆ ใน Ruby 1.8 คุณยังสามารถใช้แบบฟอร์มซับเดียวได้

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.