web-dev-qa-db-fra.com

de json à un Ruby hachage?

Je peux aller dans un sens en utilisant

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)

mais comment puis-je le récupérer en tant que mon user_lib?

45
beoliver

Vous voulez JSON.parse ou JSON.load :

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

La clé ici est d'utiliser IO.read Comme un moyen simple de charger la chaîne JSON à partir du disque, afin qu'elle puisse être analysée. Ou, si vous avez des données UTF-8 dans votre fichier:

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

J'ai lié à la documentation JSON ci-dessus, vous devriez donc aller lire cela pour plus de détails. Mais en résumé:

  • json = my_object.to_json - méthode sur l'objet spécifique pour créer une chaîne JSON.
  • json = JSON.generate(my_object) - crée une chaîne JSON à partir d'un objet.
  • JSON.dump(my_object, someIO) - crée une chaîne JSON et écrit dans un fichier.
  • my_object = JSON.parse(json) - crée un Ruby objet à partir d'une chaîne JSON.
  • my_object = JSON.load(someIO) - crée un Ruby objet à partir d'un fichier.

Alternativement:

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

Remarque: J'ai utilisé un nom "snake_case" pour la méthode correspondant à votre "camelCase" saveUserLib car il s'agit de la convention Ruby.

97
Phrogz

voici un exemple:

require 'json'

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

JSON.load fera l'affaire. Voici un exemple qui va dans les deux sens:

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