Как записать в файл 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?

dt1000
источник
Взгляните на этот ТАК-ответ: stackoverflow.com/questions/1684588/…
Чарли Мартин
То, что вы делаете, я часто использую для документирования используемых мной структур JSON и YAML. Я напишу небольшой фрагмент кода для сохранения YAML / JSON в файл, а затем построю те же структуры, показывающие, как данные должны выглядеть до и / или после сброса и перезагрузки. Итак, хотя ваш код работает не совсем правильно, придерживайтесь этого процесса, поскольку он в конечном итоге облегчает жизнь.
Железный Человек

Ответы:

177

Требовать библиотеку 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

Ваш файл 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/…
Коннор Лич
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
Мне нравится вариант "а +". Не стирает существующие данные.
boulder_ruby
2
Добавление @boulder_ruby может иметь смысл только в том случае, если формат файла - JSONlines (один объект JSON на строку) и с которым почти никогда не хорошо сочетается pretty_generate, если только потребителем вывода не является человек. Даже тогда лучше сгенерировать JSONlines и использовать что-то вроде jqпросмотра вывода.
Sim
11

Этот вопрос касается Ruby 1.8, но он по-прежнему остается на первом месте при поиске в Google.

в ruby> = 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 }
Haseeb Eqx
источник
3

Чтобы это работало в Ubuntu Linux:

  1. Я установил пакет Ubuntu ruby-json:

    apt-get install ruby-json
  2. Я написал сценарий на ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc включены:

    ${HOME}/rubybin:${PATH}

(В этом случае я также набрал вышеуказанное в командной строке bash.)

Затем это сработало, когда я ввел в командную строку:

jsonDemo
Даггетт
источник