Wie konvertiere ich ein Ruby-Hash-Objekt in JSON?

340

Wie konvertiere ich ein Ruby-Hash-Objekt in JSON? Also versuche ich dieses Beispiel unten und es funktioniert nicht?

Ich habe mir den RubyDoc angesehen und offensichtlich hat das HashObjekt keine to_jsonMethode. Aber ich lese in Blogs, die Rails unterstützt active_record.to_jsonund auch unterstützt hash#to_json. Ich kann verstehen, dass ActiveRecordes sich um ein Rails-Objekt handelt, aber Hashnicht für Rails, sondern für ein reines Ruby-Objekt. Also in Rails kannst du ein machen hash.to_json, aber nicht in reinem Ruby ??

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

Antworten:

563

Eine der zahlreichen Besonderheiten von Ruby ist die Möglichkeit, vorhandene Klassen mit eigenen Methoden zu erweitern. Dies wird als "Wiedereröffnung der Klasse" oder "Affen-Patching" bezeichnet (die Bedeutung des letzteren kann jedoch variieren ).

Schauen Sie also 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, hat das Erfordernis unsere jsonMethode to_jsonauf magische Weise gebracht Hash.

Mladen Jablanović
quelle
2
alles was ich sagen kann ist wow :) auch vielen dank !! Also im Grunde konnte ich die JSON-Klasse dynamisch erweitern?
Kapso
1
Ich habe das gleiche mit Ruby-Objekt versucht und es funktioniert nicht? >> 'json' erfordern => true >> Klasse Person >> attr_accessor: fname ,: lname >> end => nil >> p = Person.new => # <Person: 0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "# <Person: 0x101155f70>"
kapso
10
Nein, nein, jemand muss codieren, wie das Objekt einer beliebigen Klasse in JSON serialisiert werden soll. Sie haben es für Hashund ArrayKlassen in jsonEdelstein getan , aber Ihre Klasse Personist nur eine Ebene Object. Sie können aber Hashstattdessen erben . Sie können eine neue Frage öffnen, wenn Sie dies nicht verwalten.
Mladen Jablanović
Vielen Dank. Hier ist die neue Frage, jede Hilfe wäre dankbar. Vielen Dank. stackoverflow.com/questions/3226054/…
kapso
Sie zeigen, was wie eine Ausgabe vom Typ IRB aussieht. Ich habe versucht, Hash # to_json für das DateTime-Objekt zum Laufen zu bringen. Dank diesem Beitrag habe ich es bekommen. Aber ich habe mit p date_json inspiziert. Dies ist, was ich für eine echte Zeichenfolge "{" Jahr ": 2013," Montag ": 7," Tag ": 16," Stunde ": 13, bekommen habe. "min": 54, "sec": 32, "zone": "- 05:00", "offset": - 18000} ", damit Sie sehen können, dass es das macht Schlüsselsymbole als Zeichenfolgen und natürlich bleiben diese Daten unverändert. Danke noch einmal. Entschuldigung, ich bin so spät dran.
Douglas G. Allen
19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json
nurettin
quelle
6

Sie können auch verwenden JSON.generate:

require 'json'

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

Oder sein Alias JSON.unparse:

require 'json'

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

Fügen Sie die folgende Zeile oben in Ihre Datei ein

require 'json'

Dann können Sie verwenden:

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

Alternativ können Sie Folgendes verwenden:

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

Sie sollten jsonin Ihre Datei aufnehmen

Zum Beispiel,

require 'json'

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

Weitere Informationen jsonfinden Sie unter folgendem Link. Json Lernen

Foram Thakral
quelle