2012-01-29 15 views
46

puedo ir en una dirección utilizandode json a un hash de ruby?

require 'json' 

def saveUserLib(user_lib) 
    File.open("/Users/name/Documents/user_lib.json","w") do |f| 
    f.write($user_lib.to_json) 
    end 
end 

uname = gets.chomp 
$user_lib["_uname"] = uname 
saveUserLib($user_lib) 

pero ¿cómo puedo recuperarlo de nuevo como mi user_lib?

+3

Pequeña crítica de código: no debe codificar la ruta del archivo en su método. Debería hacer que su método acepte una ruta de archivo, o poner una constante en la parte superior de su archivo con la ruta de acceso a usar. Regla de oro (siempre hay excepciones): si alguna vez codificas un número (que no sea quizás 1) o una cadena de usuario dentro de un método, estás haciendo que tu código sea más frágil y más difícil de mantener. – Phrogz

+0

cuando elimino mis '$' s obtengo el siguiente error: '

': variable local indefinida o método' user_lib' para main: Object (NameError) – beoliver

+1

pero sobre la ruta, esto lo sé, pero fue por una prueba rápida! gracias por la atención aunque – beoliver

Respuesta

96

usted quiere JSON.parse o JSON.load:

def load_user_lib(filename) 
    JSON.parse(IO.read(filename)) 
end 

La clave aquí es utilizar IO.read como una forma sencilla para cargar la cadena JSON desde el disco, de modo que puede ser analizado O bien, si tiene datos UTF-8 en su archivo:

my_object = JSON.parse(IO.read(filename, encoding:'utf-8')) 

me he vinculado a la documentación JSON anterior, por lo que debería ir a leer que para más detalles. Pero en resumen:

  • json = my_object.to_json - método sobre el objeto específico para crear una cadena JSON.
  • json = JSON.generate(my_object) - crea cadena JSON del objeto.
  • JSON.dump(my_object, someIO) - crea una cadena JSON y escribe en un archivo.
  • my_object = JSON.parse(json) - crea un objeto Ruby a partir de una cadena JSON.
  • my_object = JSON.load(someIO) - crea un objeto Ruby desde un archivo.

alternativa:

def load_user_lib(filename) 
    File.open(filename, "r") do |f| 
    JSON.load(f) 
    end 
end 

Nota: He utilizado un nombre "snake_case" para el método correspondiente a su "camelCase" saveUserLib ya que esta es la convención de Ruby.

+0

cuál es la diferencia entre' JSON.dump '/' .to_json'/'JSON.generate' y luego' JSON.parse'/'JSON.load'? – beoliver

+0

@ user969617 He editado mi respuesta para mostrar la diferencia y resumir las formas de tratar con los datos JSON. – Phrogz

+0

Ambos 'JSON.parse' y' JSON.load' pueden "crear un objeto Ruby a partir de una cadena JSON" – pje

2

aquí es un poco de ejemplo:

require 'json' 

source_hash = {s: 12, f: 43} 
json_string = JSON.generate source_hash 
back_to_hash = JSON.parse json_string 
+1

¡No es cierto! El resultado 'JSON.parse' está lleno como' {"s" => 12, "f" => 43} 'not' {s: 12, f: 43} ' –

2

JSON.load hará el truco. Aquí hay un ejemplo que va en ambos sentidos:

>> require 'json' 
=> true 
>> a = {"1" => "2"} 
=> {"1"=>"2"} 
>> b = JSON.dump(a) 
=> "{\"1\":\"2\"}" 
>> c = JSON.load(b) 
=> {"1"=>"2"}