Je me demande quel est le meilleur moyen de convertir une paire valeur / clé au format json en hachage rubis avec un symbole comme clé: exemple:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Existe-t-il une méthode d'assistance qui peut faire cela?
http://stackoverflow.com/a/43773159/1297435
pour les rails 4.1Réponses:
en utilisant le gem json lors de l'analyse de la chaîne json, vous pouvez passer l'option symbolize_names. Voir ici: http://flori.github.com/json/doc/index.html (regardez sous parse)
par exemple:
la source
:symbolize_keys
? pourquoi ce nom a-t-il changé?symbolize_keys
c'est un truc Rails.Leventix, merci pour votre réponse.
La méthode Marshal.load (Marshal.dump (h)) a probablement le plus d'intégrité des différentes méthodes car elle préserve les types de clé d'origine de manière récursive .
Ceci est important dans le cas où vous avez un hachage imbriqué avec un mélange de clés de chaîne et de symbole et que vous souhaitez conserver ce mélange lors du décodage (par exemple, cela peut se produire si votre hachage contient vos propres objets personnalisés en plus d'un tiers très complexe / imbriqué -party objets dont vous ne pouvez pas manipuler / convertir les clés pour une raison quelconque, comme une contrainte de temps de projet).
Par exemple:
Méthode 1 : JSON.parse - symbolise toutes les clés de manière récursive => Ne conserve pas le mélange d'origine
Méthode 2 : ActiveSupport :: JSON.decode - symbolise uniquement les clés de niveau supérieur => Ne conserve pas le mélange d'origine
Méthode 3 : Marshal.load - préserve le mélange chaîne / symbole d'origine dans les clés imbriquées. PARFAIT!
À moins qu'il y ait un inconvénient dont je ne suis pas conscient, je pense que la méthode 3 est la voie à suivre.
À votre santé
la source
Il n'y a rien de intégré pour faire le tour, mais il n'est pas trop difficile d'écrire le code pour le faire en utilisant le gem JSON. Il existe une
symbolize_keys
méthode intégrée à Rails si vous l'utilisez, mais qui ne symbolise pas les clés de manière récursive comme vous en avez besoin.Comme le dit Leventix, le gem JSON ne gère que les chaînes entre guillemets (ce qui est techniquement correct - JSON doit être formaté avec des guillemets doubles). Ce morceau de code nettoiera cela avant d'essayer de l'analyser.
la source
Méthode récursive:
la source
Bien sûr, il existe une gemme json , mais qui ne gère que les guillemets doubles.
la source
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
place.Une autre façon de gérer cela consiste à utiliser la sérialisation / désérialisation YAML, qui préserve également le format de la clé:
Bénéficier de cette approche, cela semble être un format plus adapté aux services REST ...
la source
YAML.load
est destiné à sérialiser des objets arbitraires (par exemple pour le cache). La propositionYAML.safe_load
a été introduite quelques mois après cet article de blog, il s'agit donc d'utiliser la bonne chose: github.com/ruby/psych/commit/…Le moyen le plus pratique consiste à utiliser la gemme nice_hash: https://github.com/MarioRuiz/nice_hash
la source