2010-07-06 13 views
257

Jak przekonwertować obiekt hash ruby ​​na JSON? Więc próbuję tego przykładu poniżej & to nie działa?Jak przekonwertować obiekt hash ruby ​​na JSON?

Patrzyłem na RubyDoc i oczywiście obiekt Hash nie ma metody to_json. Ale czytam na blogach, że Rails obsługuje active_record.to_json, a także obsługuje hash#to_json. Rozumiem, że ActiveRecord to obiekt Railsowy, ale Hash nie jest natywny dla Railsów, to czysty obiekt Ruby. Więc w Railsach możesz zrobić hash.to_json, ale nie w czystej Ruby?

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

Odpowiedz

449

Jedną z licznych niuansów Ruby jest możliwość rozszerzenia istniejących klas o własne metody. Nazywa się to "ponownym otwarciem klasy" lub łataniem małp (co oznacza, że ​​jest to drugie z nich, can vary).

Więc spójrz tutaj:

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

Jak widać, wymagające json magicznie przyniósł metodę to_json do naszego Hash.

+2

wszystko, co mogę powiedzieć, to wow :) również bardzo dziękuję !! , więc zasadniczo mogłem dynamicznie rozszerzać klasę json? – kapso

+1

Próbowałem tego samego z obiektem Ruby i to nie działa ?? >> require 'json' => true >> klasa Person >> attr_accessor: fname: lname >> koniec => nil >> p = Person.new => # >> p.fname = "Bill" => "Bill" >> p.lname = "Shine" => "Shine" >> p.to_json => "\" # \ "" – kapso

+8

Nie, nie, ktoś musi zakodować sposób, w jaki obiekt klasy arbitralnej powinien być serializowany do JSON. Zrobili to dla klas 'Hash' i' Array' w 'json' gem, ale twoja klasa' Person' jest po prostu zwykłym 'Object'. Ale zamiast tego możesz dziedziczyć 'Hash'. Możesz otworzyć nowe pytanie, jeśli nie zarządzasz. –

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

puts {hash: 123}.to_json 
Powiązane problemy