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.