2010-07-06 14 views
257

Wie konvertiert man ein Ruby-Hash-Objekt in JSON? Also versuche ich dieses Beispiel unter & es funktioniert nicht?Wie konvertiert man ein Ruby-Hash-Objekt in JSON?

Ich schaute auf die RubyDoc und offensichtlich Hash Objekt hat keine to_json Methode. Aber ich lese in Blogs, dass Rails active_record.to_json unterstützt und unterstützt auch hash#to_json. Ich kann verstehen, ActiveRecord ist ein Rails-Objekt, aber Hash ist nicht nativen Rails, es ist ein reines Ruby-Objekt. Also in Rails kannst du eine hash.to_json machen, aber nicht in reinem Ruby ??

Antwort

449

Eine der zahlreichen Feinheiten von Ruby ist die Möglichkeit, bestehende Klassen mit eigenen Methoden zu erweitern. Das nennt man "Klassenwiederherstellung" oder "Affe-Patching" (die Bedeutung von letzterem can vary, obwohl).

Also, schauen Sie hier:

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

Wie Sie sehen können json erfordern Methode magisch gebracht hat to_json in unseren Hash.

+2

alles was ich sagen kann ist wow :) auch vielen dank !! so im Grunde war ich in der Lage, die Json-Klasse dynamisch zu erweitern? – kapso

+1

Ich habe das gleiche mit Ruby-Objekt versucht und es funktioniert nicht ?? >> require 'json' => true >> Klasse Person >> attr_accessor: fname,: lname >> Ende => nil >> p = Person.new => # >> p.fname = "Bill" => "Bill" >> p.lname = "Shine" => "Shine" >> p.to_json => "\" # \ "" – kapso

+8

Nein, nein, jemand muss programmieren, wie das Objekt einer beliebigen Klasse in JSON serialisiert werden soll. Sie haben es für 'Hash'- und' Array'-Klassen in 'json' gem gemacht, aber Ihre Klasse' Person' ist nur ein einfaches 'Objekt'. Aber Sie können Hash stattdessen erben. Sie können eine neue Frage öffnen, wenn Sie nicht verwalten. –

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

puts {hash: 123}.to_json 
Verwandte Themen