Cómo escribir en un archivo JSON en el formato correcto

111

Estoy creando un hash en Ruby y quiero escribirlo en un archivo JSON, en el formato correcto.

Aquí está mi código:

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

Y aquí está el contenido del archivo resultante:

key_aval_akey_bval_b

Estoy usando Sinatra (no sé qué versión) y Ruby v 1.8.7.

¿Cómo puedo escribir esto en el archivo en el formato JSON correcto?

dt1000
fuente
Eche un vistazo a esta respuesta SO: stackoverflow.com/questions/1684588/…
Charlie Martin
Lo que estás haciendo es en realidad algo que uso mucho para documentar las estructuras JSON y YAML que uso. Escribiré un pequeño fragmento de código para guardar el YAML / JSON en un archivo, luego construiré las mismas estructuras que muestran cómo deberían verse los datos antes y / o después de descargar y volver a cargar. Entonces, aunque su código no funciona del todo bien, siga con este proceso, ya que le facilita la vida a largo plazo.
The Tin Man

Respuestas:

177

Requiere la biblioteca JSON y usa 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

Su archivo temp.json ahora se ve así:

{"key_a":"val_a","key_b":"val_b"}
Mike Lewis
fuente
3
Mejora menor: sugiero la forma de bloque:File.open(...){ |f| f << h.to_json }
Phrogz
18
JSON.pretty_generate(tempHash)también es rad ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/…
Connor Leech
94

Con formato

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

Salida

{
    "key_a":"val_a",
    "key_b":"val_b"
}
Anders B
fuente
1
Me gusta la opción "a +". No golpea los datos existentes.
boulder_ruby
2
@boulder_ruby agregar solo puede tener sentido si el formato de archivo es JSONlines (un objeto JSON por línea) y eso casi nunca combina bien pretty_generate, a menos que el consumidor de la salida sea un humano. Incluso entonces, es mejor generar JSONlines y usar algo como jqpara ver el resultado.
Sim
11

Esta pregunta es para ruby ​​1.8, pero aún aparece en la parte superior cuando se busca en Google.

en ruby> = 1.9 puedes usar

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

Aparte de lo mencionado en otras respuestas, en ruby ​​1.8 también puede usar un formulario de revestimiento

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

Para que esto funcione en Ubuntu Linux:

  1. Instalé el paquete de Ubuntu ruby-json:

    apt-get install ruby-json
  2. Escribí el guión en ${HOME}/rubybin/jsonDEMO

  3. $HOME/.bashrc incluido:

    ${HOME}/rubybin:${PATH}

(En esta ocasión también escribí lo anterior en la línea de comando de bash).

Luego funcionó cuando entré en la línea de comando:

jsonDemo
daggett
fuente