¿Cómo convertir un objeto ruby ​​hash a JSON?

340

¿Cómo convertir un objeto ruby ​​hash a JSON? ¿Estoy probando este ejemplo a continuación y no funciona?

Estaba mirando el RubyDoc y obviamente el Hashobjeto no tiene un to_jsonmétodo. Pero estoy leyendo en blogs que Rails admite active_record.to_jsony también admite hash#to_json. Puedo entender que ActiveRecordes un objeto Rails, pero Hashno es nativo de Rails, es un objeto Ruby puro. ¿Entonces en Rails puedes hacer un hash.to_json, pero no en Ruby puro?

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

Respuestas:

563

Una de las numerosas ventajas de Ruby es la posibilidad de ampliar las clases existentes con sus propios métodos. Eso se llama "reapertura de clase" o parches de mono ( sin embargo, el significado de este último puede variar ).

Entonces, mira aquí:

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"}"

Como puede ver, el requerimiento jsonha traído un método mágico to_jsona nuestro Hash.

Mladen Jablanović
fuente
2
todo lo que puedo decir es wow :) también muchas gracias !! ¿Así que básicamente pude extender la clase json dinámicamente?
kapso el
1
Intenté lo mismo con el objeto Ruby y no funciona. >> require 'json' => true >> clase Persona >> attr_accessor: fname,: lname >> end => nil >> p = Person.new => # <Persona: 0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "# <Persona: 0x101155f70> \" "
kapso
10
No, no, alguien tiene que codificar cómo se debe serializar el objeto de una clase arbitraria a JSON. Lo hicieron por clases Hashy Arrayen jsongema, pero tu clase Persones sencilla Object. Pero puedes heredar en su Hashlugar. Puede abrir una nueva pregunta si no se las arregla.
Mladen Jablanović
Gracias. Aquí está la nueva pregunta, cualquier ayuda sería apreciada. Gracias. stackoverflow.com/questions/3226054/…
kapso
Estás mostrando lo que parece ser una salida de tipo IRB. Estaba tratando de hacer que el hash # to_json funcione para el objeto DateTime. Gracias a este post lo tengo. Pero inspeccioné con p date_json Esto es lo que obtuve para una cadena verdadera "{\" año \ ": 2013, \" mon \ ": 7, \" mday \ ": 16, \" hora \ ": 13, \ "min \": 54, \ "sec \": 32, \ "zone \": \ "- 05:00 \", \ "offset \": - 18000} "para que pueda ver que está haciendo el símbolos clave como cadenas y, por supuesto, que los datos no cambian. Gracias de nuevo. Lo siento, llego muy tarde.
Douglas G. Allen
19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json
nurettin
fuente
6

También puedes usar JSON.generate:

require 'json'

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

O su alias JSON.unparse:

require 'json'

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

Agregue la siguiente línea en la parte superior de su archivo

require 'json'

Entonces puedes usar:

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

Alternativamente, puede usar:

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

Debes incluir jsonen tu archivo

Por ejemplo,

require 'json'

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

Para obtener más información sobre jsonusted puede visitar el siguiente enlace. Json Learning

Foram Thakral
fuente