Comment convertir un objet de hachage rubis en JSON?

340

Comment convertir un objet de hachage rubis en JSON? J'essaie donc cet exemple ci-dessous et cela ne fonctionne pas?

Je regardais le RubyDoc et évidemment l' Hashobjet n'a pas de to_jsonméthode. Mais je lis sur des blogs que Rails supporte active_record.to_jsonet supporte également hash#to_json. Je peux comprendre que ActiveRecordc'est un objet Rails, mais Hashn'est pas natif de Rails, c'est un pur objet Ruby. Donc, dans Rails, vous pouvez faire un hash.to_json, mais pas en Ruby pur ??

car = {:make => "bmw", :year => "2003"}
car.to_json
kapso
la source

Réponses:

563

L'une des nombreuses subtilités de Ruby est la possibilité d'étendre les classes existantes avec vos propres méthodes. C'est ce qu'on appelle la «réouverture de classe» ou le patch de singe (la signification de ce dernier peut cependant varier ).

Alors jetez un œil ici:

car = {:make => "bmw", :year => "2003"}
# => {:make=>"bmw", :year=>"2003"}
car.to_json
# NoMethodError: undefined method `to_json' for {:make=>"bmw", :year=>"2003"}:Hash
#   from (irb):11
#   from /usr/bin/irb:12:in `<main>'
require 'json'
# => true
car.to_json
# => "{"make":"bmw","year":"2003"}"

Comme vous pouvez le voir, l'exigence jsona magiquement apporté une méthode to_jsonà notre Hash.

Mladen Jablanović
la source
2
tout ce que je peux dire c'est wow :) merci aussi beaucoup !! donc en gros j'ai pu étendre la classe json dynamiquement ??
kapso
1
J'ai essayé la même chose avec l'objet Ruby et ça ne marche pas ?? >> require 'json' => true >> class Person >> attr_accessor: fname,: lname >> end => nil >> p = Person.new => # <Person: 0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "# <Person: 0x101155f70> \" "
kapso
10
Non, non, quelqu'un doit coder comment l'objet d'une classe arbitraire doit être sérialisé en JSON. Ils l'ont fait pour Hashet des Arraycours de jsongemme, mais votre classe Personest juste une plaine Object. Mais vous pouvez hériter à la Hashplace. Vous pouvez ouvrir une nouvelle question si vous n'y parvenez pas.
Mladen Jablanović
Merci. voici la nouvelle question, toute aide serait appréciée. Merci. stackoverflow.com/questions/3226054/…
kapso
Vous montrez ce qui semble être une sortie de type IRB. J'essayais de faire fonctionner le hachage # to_json pour l'objet DateTime. Grâce à ce message, je l'ai eu. Mais j'ai inspecté avec p date_json Voici ce que j'ai obtenu pour une vraie chaîne "{\" year \ ": 2013, \" mon \ ": 7, \" mday \ ": 16, \" hour \ ": 13, \ "min \": 54, \ "sec \": 32, \ "zone \": \ "- 05:00 \", \ "offset \": - 18000} "afin que vous puissiez voir qu'il symboles clés sous forme de chaînes et bien sûr que les données sont inchangées. Merci encore. Désolé, je suis si tard.
Douglas G. Allen du
19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json
nurettin
la source
6

Vous pouvez également utiliser JSON.generate:

require 'json'

JSON.generate({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

Ou son alias, JSON.unparse:

require 'json'

JSON.unparse({ foo: "bar" })
=> "{\"foo\":\"bar\"}"
Vinicius Brasil
la source
3

Ajoutez la ligne suivante en haut de votre fichier

require 'json'

Ensuite, vous pouvez utiliser:

car = {:make => "bmw", :year => "2003"}
car.to_json

Alternativement, vous pouvez utiliser:

JSON.generate({:make => "bmw", :year => "2003"})
Apurv Pandey
la source
-1

Vous devez inclure jsondans votre dossier

Par exemple,

require 'json'

your_hash = {one: "1", two: "2"}
your_hash.to_json

Pour plus de connaissances sur jsonvous pouvez visiter le lien ci-dessous. Json Learning

Foram Thakral
la source