Як записати у файл 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?


Подивіться на цю ТАКУ відповідь: 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 }
Фрогз

18
JSON.pretty_generate(tempHash)також rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech

94

З форматуванням

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щоб побачити вихід.
Сім

11

Це питання стосується ruby ​​1.8, але воно все ще залишається на вершині під час гуглінгу.

в рубіні> = 1,9 ви можете використовувати

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

окрім зазначеного в інших відповідях, у рубіні 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.