Como gravar em um arquivo JSON no formato correto

111

Estou criando um hash em Ruby e quero gravá-lo em um arquivo JSON, no formato correto.

Aqui está o meu código:

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

E aqui está o conteúdo do arquivo resultante:

key_aval_akey_bval_b

Estou usando Sinatra (não sei qual versão) e Ruby v 1.8.7.

Como posso gravar isso no arquivo no formato JSON correto?

dt1000
fonte
Dê uma olhada nesta resposta do SO: stackoverflow.com/questions/1684588/…
Charlie Martin
O que você está fazendo é, na verdade, algo que uso muito para documentar as estruturas JSON e YAML que uso. Escreverei um pequeno código para salvar o YAML / JSON em um arquivo e, em seguida, construirei as mesmas estruturas que mostram como os dados devem ser antes e / ou depois de despejar e recarregar. Portanto, embora seu código não esteja funcionando muito bem, continue com este processo, pois ele torna a vida mais fácil a longo prazo.
The Tin Man

Respostas:

177

Exija a biblioteca JSON e use 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

Seu arquivo temp.json agora se parece com:

{"key_a":"val_a","key_b":"val_b"}
Mike Lewis
fonte
3
Melhoria menor: sugiro a forma de bloqueio:File.open(...){ |f| f << h.to_json }
Phrogz
18
JSON.pretty_generate(tempHash)também é rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech
94

Com formatação

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

Resultado

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Anders B
fonte
1
Gosto da opção "a +". Não destrói os dados existentes.
boulder_ruby de
2
A adição de @boulder_ruby só pode fazer sentido se o formato do arquivo for JSONlines (um objeto JSON por linha) e dificilmente combina bem com pretty_generate, a menos que o consumidor da saída seja um humano. Mesmo assim, é melhor gerar JSONlines e usar algo como jqpara ver a saída.
Sim
11

Esta pergunta é para Ruby 1.8, mas ainda vem em primeiro lugar ao pesquisar no Google.

em ruby> = 1,9 você pode usar

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

diferente do que foi mencionado em outras respostas, no Ruby 1.8 você também pode usar um formulário de liner

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

Para fazer isso funcionar no Ubuntu Linux:

  1. Instalei o pacote do Ubuntu ruby-json:

    apt-get install ruby-json
  2. Eu escrevi o roteiro em ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc incluído:

    ${HOME}/rubybin:${PATH}

(Nesta ocasião, eu também digitei o código acima na linha de comando do bash.)

Então funcionou quando entrei na linha de comando:

jsonDemo
daggett
fonte