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
kapso
źródło

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.

Mladen Jablanović
źródło
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
nurettin
źródło
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\"}"
Vinicius Brasil
źródło
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"})
Apurv Pandey
źródło
-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

Foram Thakral
źródło