quel est le meilleur moyen de convertir un format json valeur de la clé de la paire de rubis de hachage avec le symbole de clé?
Je me demande quel est le meilleur moyen de convertir un format json valeur de la clé de la paire de rubis de hachage avec le symbole de la clé:
exemple:
{ 'user': { 'name': 'foo', 'age': 40, 'location': { 'city' : 'bar', 'state': 'ca' } } }
==>
{ :user=>{ :name => 'foo', :age =>'40', :location=>{ :city => 'bar', :state=>'ca' } } }
Est là une méthode d'assistance peuvent faire cela?
- essayez cette
http://stackoverflow.com/a/43773159/1297435
pour les rails 4.1
Vous devez vous connecter pour publier un commentaire.
à l'aide de l'json gem lors de l'analyse de la chaîne json, vous pouvez passer dans le symbolize_names option. Voir ici: http://flori.github.com/json/doc/index.html (voir sous parse)
par exemple:
:symbolize_keys
? pourquoi est-ce changement de nom?Leventix, je vous remercie pour votre réponse.
La Maréchal.la charge(le Maréchal.dump(h)) méthode a probablement le plus de l'intégrité des différentes méthodes, car elle préserve la clé d'original de types de manière récursive.
Ce qui est important dans le cas où vous avez un imbriquée de hachage avec un mélange de chaîne et de touches de symbole et que vous souhaitez conserver ce mélange à décoder (par exemple, cela pourrait se produire si votre hash contient vos propres objets personnalisés, en plus de très complexe/imbriquée tiers des objets dont les clés vous ne pouvez pas manipuler/convertir pour quelque raison que ce soit, comme un projet de contrainte de temps).
E. g.:
Méthode 1: JSON.analyser symbolise toutes les clés de manière récursive => Ne pas conserver original mix
Méthode 2: ActiveSupport::JSON.décoder symbolise haut-niveau des clés => Ne pas conserver original mix
Méthode 3: Le Maréchal.charge préserve chaîne d'origine/symbole mélange dans le imbriqués les touches. PARFAIT!
Sauf si il ya un inconvénient que je le sache, je pense Méthode 3 est le chemin à parcourir.
Acclamations
Il n'y a pas quelque chose de construit en faire le tour, mais il n'est pas trop dur à écrire le code pour le faire en utilisant le JSON gem. Il y a un
symbolize_keys
méthode intégrée dans les Rails si vous l'utilisez, mais cela ne veut pas symboliser les touches de manière récursive comme vous avez besoin.Comme Leventix dit, le JSON gem ne gère que les chaînes entre guillemets doubles (ce qui est techniquement correcte - JSON doit être formaté avec les guillemets). Ce morceau de code n'est propre qu'avant d'essayer de l'analyser.
Méthode récursive:
Bien sûr, il y a un json gem, mais qui ne gère que des guillemets doubles.
JSON.parse(JSON.generate([:a])) # => ["a"]
Marshal.load(Marshal.dump([:a]))
à la place.Une autre façon de gérer cela est d'utiliser YAML de sérialisation/désérialisation, qui préserve également le format de la clé:
Avantage de cette approche, il semble comme un format qui est mieux adapté pour des services REST...
YAML.load
est destinée à sérialiser des objets arbitraires (par exemple, pour le cache). Le projet deYAML.safe_load
a été introduit quelques mois après ce billet de blog, c'est une question de droit chose: github.com/ruby/psych/commit/...Le moyen le plus pratique est d'utiliser le nice_hash gem: https://github.com/MarioRuiz/nice_hash