Impossible d'utiliser la syntaxe à point pour le rubis de hachage
Je suis en utilisant net/http
de traction dans certaines des données json à partir de Yahoo Placemaker API. Après la réception de la réponse, je m'exécute JSON.parse
sur la réponse. Cela me donne une table de hachage qui ressemble à:
{"processingTime"=>"0.001493", "version"=>"1.4.0.526 build 111113", "documentLength"=>"25", "document"=>{"administrativeScope"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}}, "geographicScope"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}}, "localScopes"=>{"localScope"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US (Town)", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}, "southWest"=>{"latitude"=>"27.8132", "longitude"=>"-82.6489"}, "northEast"=>{"latitude"=>"28.1714", "longitude"=>"-82.2539"}, "ancestors"=>[{"ancestor"=>{"woeId"=>"12587831", "type"=>"County", "name"=>"Hillsborough"}}, {"ancestor"=>{"woeId"=>"2347568", "type"=>"State", "name"=>"Florida"}}, {"ancestor"=>{"woeId"=>"23424977", "type"=>"Country", "name"=>"United States"}}]}}, "extents"=>{"center"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}, "southWest"=>{"latitude"=>"27.8132", "longitude"=>"-82.6489"}, "northEast"=>{"latitude"=>"28.1714", "longitude"=>"-82.2539"}}, "placeDetails"=>{"placeId"=>"1", "place"=>{"woeId"=>"2503863", "type"=>"Town", "name"=>"Tampa, FL, US", "centroid"=>{"latitude"=>"27.9465", "longitude"=>"-82.4593"}}, "placeReferenceIds"=>"1", "matchType"=>"0", "weight"=>"1", "confidence"=>"8"}, "referenceList"=>{"reference"=>{"woeIds"=>"2503863", "placeReferenceId"=>"1", "placeIds"=>"1", "start"=>"15", "end"=>"20", "isPlaintextMarker"=>"1", "text"=>"Tampa", "type"=>"plaintext", "xpath"=>""}}}}
Je suis en mesure d'accéder à des éléments en faisant des choses comme jsonResponse['version']
mais je ne suis pas capable de faire jsonResponse.version
. Pourquoi est-ce?
- Je ne pense pas que Ruby prend en charge que.
Vous devez vous connecter pour publier un commentaire.
Hash
n'a pas de point-syntaxe pour les clés.OpenStruct
n':NOTE: Ne fonctionne pas avec imbriqués les tables de hachage.
OpenStruct va bien travailler pour un pur de hachage, mais pour le hachage avec incorporés à des tableaux ou d'autres tables de hachage, de la syntaxe à point va s'étouffer. Je suis tombé sur cette solution, qui fonctionne bien, sans les charger dans un autre joyau:
https://coderwall.com/p/74rajw/convert-a-complex-nested-hash-to-an-object
étapes de base sont:
vous pouvez maintenant accéder à tous les objets dans mystr à l'aide de la syntaxe à point.
Ruby hachages de ne pas travailler comme ça en natif, mais le HashDot gem serait travailler pour cela.
HashDot permet dot notation de syntaxe à utiliser sur les tables de hachage. Il travaille également sur les chaînes json qui ont été ré-analysées avec
JSON.parse
.Qui est une fonction JavaScript, pas un Rubis fonctionnalité. En Ruby, d'utiliser une "syntaxe à point", l'objet aurait besoin pour répondre à ces méthodes. Ruby hachages utiliser le
#[](key)
méthode pour accéder à des éléments.Pourquoi ne pas, vous pouvez le faire via la métaprogrammation
stringify_keys!
à normaliser les clés d'abord.Si vous ne souhaitez pas installer toutes les gemmes, vous pouvez essayer d'utiliser le Rubis natif
Struct
classe et Ruby trucs, comme le splat opérateur.Veuillez noter que cette solution simple ne fonctionne que pour un seul niveau de hachages. Pour la rendre dynamique et entièrement fonctionnel pour tout type de
Hash
, vous devrez le faire récursive pour créer substructs à l'intérieur de votre structure.Vous pouvez également stocker la Structure, comme si c'était une classe.
Lire plus à propos de Ruby Structure de la classe.
Parce que
Hash
n'ont pas deversion
méthode.Si c'est dans Rspec talons de sera trop de travail.