Ruby JSON analyser les changements clés de Hachage
Permet de dire que j'ai ce Hash:
{
:info => [
{
:from => "Ryan Bates",
:message => "sup bra",
:time => "04:35 AM"
}
]
}
Je peux appeler l'info tableau en faisant hash[:info]
.
Maintenant, quand je la transformer en JSON (JSON.générer), puis de l'analyser (JSON.parse), j'obtiens ce hash:
{
"info" => [
{
"from" => "Ryan Bates",
"message" => "sup bra",
"time" => "04:35 AM"
}
]
}
Maintenant si j'utilise hash[:info]
il retourne nil
, mais pas si j'utilise hash["info"]
.
Pourquoi est-ce? Et est-il de toute façon pour résoudre cette incompatibilité (en plus, en utilisant des clés de chaîne à partir du début)?
Vous devez vous connecter pour publier un commentaire.
En bref, pas. Pensez-y de cette façon, le stockage des symboles en JSON est le même que stocker des chaînes de caractères en JSON. Si vous ne pouvez pas éventuellement faire la distinction entre les deux quand il s'agit de l'analyse de la chaîne JSON. Bien sûr, vous pouvez convertir la chaîne de clés en symboles, ou dans le fait même de créer une classe pour interagir avec JSON qui le fait automatiquement, mais je vous recommande simplement à l'aide de cordes.
Mais, juste pour le plaisir de le faire, voici les réponses à cette question sont les fois précédentes, il a été demandé:
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é?
ActiveSupport::JSON décoder hachage de perdre des symboles
Ou peut-être un HashWithIndifferentAccess
Le JSON générateur convertit les symboles de chaînes car JSON ne prend pas en charge les symboles. Depuis JSON touches sont toutes les chaînes de caractères, l'analyse d'un document JSON va produire un Rubis de hachage avec de la ficelle de touches par défaut.
Vous pouvez dire à l'analyseur d'utilisation des symboles à la place des chaînes à l'aide de la
symbolize_names
option.Exemple:
Référence: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/json/rdoc/JSON.html#method-i-parse
symbolize_names
. Ma réponse références au format JSON moteur qui est fourni avec le Rubis de la bibliothèque standard. Vous faites référence à un tiers gem.J'ai résolu mon problème semblable avec l'appel de la with_indifferent_access méthode
Ici, j'ai une chaîne json et nous pouvons l'attribuer à la variable s
Je peux donc maintenant analyser les données avec la classe JSON et l'attribuer à h
Ceci va produire un hachage qui peut accepter une chaîne ou d'un symbole comme la clé
with_indifferent_access
ajouté àHash
par quelque chose dans les Rails de l'écosystème?Ce sera de manière récursive symbolisent toutes les clés dans la table de hachage.
(confirmé sur ruby 2.0)
Il est possible de modifier toutes les clés dans une table de hachage pour convertir une chaîne en un symbole:
Malheureusement cela ne fonctionne pas pour le hachage imbriquées à l'intérieur du tableau. Vous pouvez, cependant, écrire un peu de méthode récursive qui convertit toutes les clés de hachage:
Vous ne pouvez pas utiliser cette option de ce genre
ActiveSupport::JSON.decode(str_json, symbolize_names: true)
Vous pouvez utiliser symbolize_keys à gérer.