Як конвертувати об’єкт хеш-рубіну в JSON?


340

Як конвертувати об’єкт хеш-рубіну в JSON? Тому я пробую цей приклад нижче, і він не працює?

Я дивився на RubyDoc і, очевидно, Hashоб’єкт не має to_jsonметоду. Але я читаю в блогах, які Rails підтримує, active_record.to_jsonа також підтримує hash#to_json. Я можу зрозуміти, що ActiveRecordце об'єкт Rails, але Hashвін не є рідним для Rails, це чистий об'єкт Ruby. Так що в Rails можна робити hash.to_json, але не в чистому Ruby ??

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

Відповіді:


563

Однією з численних приємностей Ruby є можливість розширити існуючі класи власними методами. Це називається "повторне відкриття класу" або "мавпа", але значення останніх може змінюватися ).

Отже, подивіться тут:

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

Як бачите, необхідність jsonмагічним чином принесла to_jsonнаш метод Hash.


2
все, що я можу сказати, вау :) також велике спасибі !! так що в основному я зміг динамічно розширити клас json ??
kapso

1
Я спробував те ж саме з об'єктом Ruby, і це не працює ?? >> вимагають 'json' => справжній >> Особа класу >> attr_accessor: fname,: lname >> end => nil >> p = Person.new => # <Person: 0x101155f70> >> p.fname = "Bill "=>" Білл ">> p.lname =" Блиск "=>" Блиск ">> p.to_json =>" \ "# <Person: 0x101155f70> \" "
kapso

10
Ні, ні, хтось повинен зашифрувати, як об’єкт довільного класу повинен бути серіалізований до JSON. Вони робили це Hashі для Arrayзанять jsonдорогоцінним каменем, але ваш клас Person- просто звичайний Object. Але Hashнатомість ви можете успадкувати . Ви можете відкрити нове запитання, якщо вам це не вдається.
Младен Ябланович

Дякую. ось нове питання, будь-яка допомога буде вдячна. Дякую. stackoverflow.com/questions/3226054 / ...
kapso

Ви показуєте, як виглядає вихід IRB типу. Я намагався змусити хеш # to_json працювати для об’єкта DateTime. Завдяки цій публікації я її отримав. Але я перевірив з p date_json Ось що я отримав для справжнього рядка "{\" рік \ ": 2013, \" пн \ ": 7, \" mday \ ": 16, \" година \ ": 13, \ "min \": 54, \ "sec \": 32, \ "зона \": \ "- 05:00 \", \ "offset \": - 18000} ", тож ви можете побачити, що вона робить ключові символи як рядки, і звичайно, що дані не змінюються. Знову дякую. Вибачте, я запізнився, хоча.
Дуглас Г. Аллен


6

Ви також можете використовувати JSON.generate:

require 'json'

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

Або його псевдонім JSON.unparse:

require 'json'

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

3

Додайте наступний рядок у верхній частині файлу

require 'json'

Тоді ви можете використовувати:

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

Крім того, ви можете використовувати:

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

-1

Ви повинні включити jsonу свій файл

Наприклад,

require 'json'

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

Більш детальну інформацію про jsonвас можна знайти за посиланням нижче. Json Learning

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.