Jak przekonwertować obiekt mieszania ruby ​​na JSON?


340

Jak przekonwertować obiekt mieszania ruby ​​na JSON? Więc próbuję ten przykład poniżej i to nie działa?

Patrzyłem na RubyDoc i oczywiście Hashobiekt nie ma to_jsonmetody. Ale czytam na blogach, że wsporniki szyn active_record.to_json, a także obsługuje hash#to_json. Rozumiem, że ActiveRecordjest to obiekt Rails, ale Hashnie jest rodzimy dla Rails, jest to czysty obiekt Ruby. Więc w Railsach możesz zrobić hash.to_json, ale nie w czystym Ruby?

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

Odpowiedzi:


563

Jedną z licznych zalet Ruby jest możliwość rozszerzenia istniejących klas własnymi metodami. Nazywa się to „ponownym otwarciem klasy” lub łataniem małp (jednak znaczenie tego drugiego może się różnić ).

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 jsonmagicznie przyniósł metodę to_jsondo naszego Hash.


2
wszystko co mogę powiedzieć to wow :) również wielkie dzięki !! więc w zasadzie byłem w stanie dynamicznie rozszerzyć klasę json?
kapso

1
Próbowałem tego samego z obiektem Ruby i to nie działa? >> wymagają 'json' => true >> klasa Person >> attr_accessor: fname,: lname >> end => zero >> p = Person.new => # <Person: 0x101155f70> >> p.fname = "Bill "=>" Bill ">> p.lname =" Shine "=>" Shine ">> p.to_json =>" \ "# <Osoba: 0x101155f70> \" "
kapso

10
Nie, nie, ktoś musi zakodować, jak obiekt dowolnej klasy powinien być zserializowany do JSON. Zrobili to Hashi Arraylekcje jsonklejnotu, ale twoja klasa Personjest po prostu zwykła Object. Ale możesz Hashzamiast tego odziedziczyć . Możesz otworzyć nowe pytanie, jeśli nie zarządzasz.
Mladen Jablanović,

dzięki. oto nowe pytanie, każda pomoc byłaby mile widziana. Dzięki. stackoverflow.com/questions/3226054/…
kapso

Pokazujesz, co wygląda na wyjście typu IRB. Próbowałem uzyskać hash # to_json do pracy dla obiektu DateTime. Dzięki temu postowi mam to. Ale sprawdziłem za pomocą p date_json Oto, co otrzymałem dla prawdziwego ciągu „{\" rok \ ": 2013, \" pon \ ": 7, \" mday \ ": 16, \" godzina \ ": 13, \ "min \": 54, \ "sec \": 32, \ "zone \": \ "- 05:00 \", \ "offset \": - 18000} ", więc możesz zobaczyć, że wykonuje kluczowe symbole jako ciągi znaków i oczywiście dane nie ulegają zmianie. Dzięki jeszcze raz. Przepraszam za spóźnienie.
Douglas G. Allen

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

puts {hash: 123}.to_json

6

Możesz także użyć JSON.generate:

require 'json'

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

Lub jego alias JSON.unparse:

require 'json'

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

3

Dodaj następujący wiersz na górze pliku

require 'json'

Następnie możesz użyć:

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

Alternatywnie możesz użyć:

JSON.generate({:make => "bmw", :year => "2003"})

-1

Powinieneś dołączyć jsondo swojego pliku

Na przykład,

require 'json'

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

Aby uzyskać więcej informacji na ten temat json, odwiedź poniższy link. Json Learning

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.