2010-07-06 27 views
257

Cómo convertir un objeto hash de rubí a JSON? Entonces, estoy intentando este ejemplo debajo de & ¿no funciona?¿Cómo convertir un objeto hash de rubí a JSON?

Estaba mirando el objeto RubyDoc y obviamente Hash no tiene un método to_json. Pero estoy leyendo en blogs que Rails admite active_record.to_json y también es compatible con hash#to_json. Puedo entender que ActiveRecord es un objeto Rails, pero Hash no es originario de Rails, es un objeto Ruby puro. Entonces en Rails puedes hacer un hash.to_json, pero no en el puro Ruby ??

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

Respuesta

449

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

Por lo tanto, echar un vistazo 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 se puede ver, lo que requiere json ha llevado mágicamente método to_json a nuestra Hash.

+2

todo lo que puedo decir es wow :) también muchas gracias !! así que, básicamente, pude extender la clase json de forma dinámica? – kapso

+1

Probé lo mismo con el objeto Ruby y no funciona? >> require 'json' => true >> clase Persona >> attr_accessor: fnombre,: lname >> final => nil >> p = Person.new => # >> p.fname = "Bill" => "Bill" >> p.lname = "Shine" => "Shine" >> p.to_json => "\" # \ "" – kapso

+8

No, no, alguien tiene que codificar cómo el objeto de una clase arbitraria debe ser serializado a JSON. Lo hicieron para las clases 'Hash' y' Array' en la gema 'json', pero su clase' Person' es simplemente un 'Objeto' simple. Pero puedes heredar 'Hash' en su lugar. Puedes abrir una nueva pregunta si no te las arreglas. –

13
require 'json/ext' # to use the C based extension instead of json/pure 

puts {hash: 123}.to_json