46 votes

de json à un hash ruby ?

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 la récupérer en tant que user_lib ?

3 votes

Petite critique sur le code : vous ne devriez pas coder en dur le chemin du fichier dans votre méthode. Vous devez soit faire en sorte que votre méthode accepte un chemin de fichier, soit placer une constante au début de votre fichier avec le chemin à utiliser. Règle générale (il y a toujours des exceptions) : si vous codez en dur un nombre (autre que peut-être 1) ou une chaîne de caractères destinée à l'utilisateur dans une méthode, vous rendez votre code plus fragile et plus difficile à maintenir.

0 votes

Lorsque je retire mon $ j'obtiens l'erreur suivante : <main>': undefined local variable or method user_lib' pour main:Object (NameError)

1 votes

Mais pour ce qui est du chemin, j'en suis conscient, mais il s'agissait d'un test rapide ! merci de m'avoir prévenu.

97voto

Phrogz Points 112337

Vous voulez JSON.parse o JSON.load :

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

La clé est d'utiliser IO.read est un moyen simple de charger la chaîne JSON depuis le 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 mis un lien vers la documentation JSON ci-dessus, vous devriez donc la lire pour plus de détails. Mais en résumé :

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

Alternativement :

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

Note : J'ai utilisé un nom "snake_case" pour la méthode correspondant à votre "camelCase" saveUserLib car c'est la convention Ruby.

0 votes

Quelle est la différence entre JSON.dump / .to_json / JSON.generate et ensuite JSON.parse / JSON.load ?

0 votes

@user969617 J'ai édité ma réponse pour montrer la différence et résumer les façons de traiter les données JSON.

0 votes

Les deux JSON.parse y JSON.load peut "créer un objet Ruby à partir d'une chaîne JSON"

2voto

alexkv Points 2102

Voici quelques exemples :

require 'json'

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

1 votes

Ce n'est pas vrai ! JSON.parse Le résultat est une chaîne de caractères complète comme {"s"=>12, "f"=>43} no {s: 12, f: 43}

2voto

Chris Bunch Points 25857

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"}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X