Jak pisać do pliku JSON w odpowiednim formacie

111

Tworzę hash w Rubim i chcę zapisać go w pliku JSON w odpowiednim formacie.

Oto mój kod:

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

A oto zawartość pliku wynikowego:

key_aval_akey_bval_b

Używam Sinatry (nie wiem jaka wersja) i Ruby v 1.8.7.

Jak mogę zapisać to do pliku w odpowiednim formacie JSON?

dt1000
źródło
Spójrz na tę SO odpowiedź: stackoverflow.com/questions/1684588/ ...
Charlie Martin
To, co robisz, jest w rzeczywistości czymś, czego często używam do dokumentowania struktur JSON i YAML, których używam. Napiszę mały fragment kodu, aby zapisać YAML / JSON do pliku, a następnie zbuduję te same struktury pokazujące, jak powinny wyglądać dane przed i / lub po zrzuceniu i ponownym załadowaniu. Tak więc, chociaż twój kod nie działa poprawnie, trzymaj się tego procesu, ponieważ na dłuższą metę ułatwia to życie.
Tin Man

Odpowiedzi:

177

Wymagaj biblioteki JSON i użyj 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

Twój plik temp.json wygląda teraz następująco:

{"key_a":"val_a","key_b":"val_b"}
Mike Lewis
źródło
3
Niewielka poprawa: proponuję formę blokową:File.open(...){ |f| f << h.to_json }
Phrogz
18
JSON.pretty_generate(tempHash)jest również rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech
95

Z formatowaniem

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

Wynik

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Anders B.
źródło
1
Podoba mi się opcja „a +”. Nie blokuje istniejących danych.
boulder_ruby
2
Dodawanie @boulder_ruby może mieć sens tylko wtedy, gdy format pliku to JSONlines (jeden obiekt JSON na linię) i rzadko łączy się dobrze pretty_generate, chyba że konsumentem wyjścia jest człowiek. Nawet wtedy lepiej jest wygenerować linie JSON i użyć czegoś takiego, jak jqdo wyświetlenia danych wyjściowych.
Sim
11

To pytanie dotyczy ruby ​​1.8, ale nadal jest na topie podczas wyszukiwania w Google.

w ruby> = 1,9 możesz użyć

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

poza tym, co wspomniano w innych odpowiedziach, w Ruby 1.8 możesz również użyć jednego formularza liniowego

File.open("public/temp.json","w"){ |f| f.write tempHash.to_json }
Haseeb Eqx
źródło
3

Aby to działało w systemie Ubuntu Linux:

  1. Zainstalowałem pakiet Ubuntu ruby-json:

    apt-get install ruby-json
  2. Napisałem scenariusz w ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc w zestawie:

    ${HOME}/rubybin:${PATH}

(Przy tej okazji również wpisałem powyższe w linii poleceń bash.)

Wtedy zadziałało, gdy wszedłem w linii poleceń:

jsonDemo
daggett
źródło