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

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.


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

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

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

-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.