¿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

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.


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

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

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

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.