如何以正确的格式写入JSON文件

dt1*_*000 100 ruby json file

我在Ruby中创建一个哈希,并希望以正确的格式将其写入JSON文件.

这是我的代码:

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

以下是生成的文件的内容:

key_aval_akey_bval_b
Run Code Online (Sandbox Code Playgroud)

我正在使用Sinatra(不知道是什么版本)和Ruby v 1.8.7.

如何以正确的JSON格式将其写入文件?

Mik*_*wis 163

需要JSON库,并使用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
Run Code Online (Sandbox Code Playgroud)

您的temp.json文件现在看起来像:

{"key_a":"val_a","key_b":"val_b"}
Run Code Online (Sandbox Code Playgroud)

  • `JSON.pretty_generate(tempHash)`也是rad http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#method-i-pretty_generate (12认同)
  • 小改进:我建议使用块形式:`File.open(...){| f | f << h.to_json}` (2认同)

And*_*s B 81

格式化

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
Run Code Online (Sandbox Code Playgroud)

产量

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Run Code Online (Sandbox Code Playgroud)

  • @boulder_ruby 附加可能仅在文件格式为 JSONlines(每行一个 JSON 对象)时才有意义,并且几乎无法与 `pretty_generate` 很好地结合,除非输出的使用者是人类。即便如此,最好生成 JSONlines 并使用类似 `jq` 之类的东西来查看输出。 (2认同)

Has*_*Eqx 8

这个问题适用于ruby 1.8,但在google搜索时仍然排在首位.

在1.9以上的红宝石中你可以使用

File.write("public/temp.json",tempHash.to_json)
Run Code Online (Sandbox Code Playgroud)

除了在其他答案中提到的,在ruby 1.8中你也可以使用一种衬垫形式

File.open("public/temp.json","w"){ |f| f.write tempHash.to_json }
Run Code Online (Sandbox Code Playgroud)