Cách ghi vào tệp JSON ở định dạng chính xác


111

Tôi đang tạo một hàm băm trong Ruby và muốn ghi nó vào một tệp JSON, ở định dạng chính xác.

Đây là mã của tôi:

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

Và đây là nội dung của tệp kết quả:

key_aval_akey_bval_b

Tôi đang sử dụng Sinatra (không biết phiên bản nào) và Ruby v 1.8.7.

Tôi làm cách nào để ghi điều này vào tệp ở định dạng JSON chính xác?


Hãy xem câu trả lời SO này: stackoverflow.com/questions/1684588/…
Charlie Martin,

Những gì bạn đang làm thực sự là thứ mà tôi sử dụng rất nhiều để ghi lại cấu trúc JSON và YAML mà tôi sử dụng. Tôi sẽ viết một đoạn mã nhỏ để lưu YAML / JSON vào một tệp, sau đó xây dựng các cấu trúc tương tự hiển thị dữ liệu sẽ trông như thế nào trước và / hoặc sau khi kết xuất và tải lại. Vì vậy, mặc dù mã của bạn không hoạt động bình thường, hãy kiên trì với quy trình này vì nó giúp cuộc sống dễ dàng hơn về lâu dài.
the Tin Man,

Câu trả lời:


177

Yêu cầu thư viện JSON và sử dụng 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

Tệp temp.json của bạn bây giờ trông giống như sau:

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

3
Cải thiện nhỏ: Tôi đề xuất hình thức khối:File.open(...){ |f| f << h.to_json }
Phrogz

18
JSON.pretty_generate(tempHash)cũng là rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech

94

Với định dạng

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

Đầu ra

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

1
Tôi thích tùy chọn "a +". Không chặn dữ liệu hiện có.
boulder_ruby

2
Việc bổ sung @boulder_ruby chỉ có thể có ý nghĩa nếu định dạng tệp là JSONlines (một đối tượng JSON trên mỗi dòng) và điều đó hiếm khi kết hợp tốt với nhau pretty_generate, trừ khi người tiêu dùng đầu ra là con người. Thậm chí sau đó, tốt hơn là tạo JSONlines và sử dụng một cái gì đó như jqđể xem kết quả.
Sim

11

Câu hỏi này dành cho ruby ​​1.8 nhưng nó vẫn xuất hiện hàng đầu khi googling.

trong ruby> = 1.9 bạn có thể sử dụng

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

ngoài những gì được đề cập trong các câu trả lời khác, trong ruby ​​1.8, bạn cũng có thể sử dụng một dạng lót

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

3

Để làm cho điều này hoạt động trên Ubuntu Linux:

  1. Tôi đã cài đặt gói Ubuntu ruby-json:

    apt-get install ruby-json
  2. Tôi đã viết kịch bản trong ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc bao gồm:

    ${HOME}/rubybin:${PATH}

(Nhân dịp này, tôi cũng đã gõ ở trên vào dòng lệnh bash.)

Sau đó, nó hoạt động khi tôi nhập vào dòng lệnh:

jsonDemo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.