Làm cách nào để chuyển đổi một đối tượng băm ruby ​​thành JSON?


340

Làm cách nào để chuyển đổi một đối tượng băm ruby ​​thành JSON? Vì vậy, tôi đang thử ví dụ này dưới đây & nó không hoạt động?

Tôi đã xem xét RubyDoc và rõ ràng Hashđối tượng không có to_jsonphương pháp. Nhưng tôi đang đọc trên blog mà Rails hỗ trợ active_record.to_jsonvà cũng hỗ trợ hash#to_json. Tôi có thể hiểu ActiveRecordlà một đối tượng Rails, nhưng Hashkhông có nguồn gốc từ Rails, nó là một đối tượng Ruby thuần túy. Vì vậy, trong Rails bạn có thể làm một hash.to_json, nhưng không phải trong Ruby thuần túy ??

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

Câu trả lời:


563

Một trong vô số các đặc tính của Ruby là khả năng mở rộng các lớp hiện có bằng các phương thức của riêng bạn. Điều đó được gọi là "mở lại lớp" hoặc vá khỉ ( tuy nhiên ý nghĩa của cái sau có thể thay đổi ).

Vì vậy, hãy xem ở đây:

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

Như bạn có thể thấy, yêu cầu jsonđã mang phương pháp kỳ diệu đến to_jsonvới chúng tôi Hash.


2
tất cả những gì tôi có thể nói là wow :) cũng cảm ơn rất nhiều !! vì vậy về cơ bản tôi đã có thể mở rộng lớp json một cách linh hoạt ??
kapso

1
Tôi đã thử điều tương tự với đối tượng Ruby và nó không hoạt động ?? >> yêu cầu 'json' => true >> class 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
Không, không, ai đó phải mã hóa cách đối tượng của một lớp tùy ý nên được tuần tự hóa thành JSON. Họ đã làm nó cho HashArraycác lớp trong jsonđá quý, nhưng lớp của bạn Personchỉ là một đơn giản Object. Nhưng bạn có thể thừa kế Hashthay thế. Bạn có thể mở một câu hỏi mới nếu bạn không quản lý.
Mladen Jablanović

cảm ơn. Đây là câu hỏi mới, bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn. stackoverflow.com/questions
326054 / từ

Bạn đang hiển thị những gì có vẻ là đầu ra loại IRB. Tôi đã cố gắng để hàm # to_json hoạt động cho đối tượng DateTime. Nhờ bài này tôi đã nhận được nó. Nhưng tôi đã kiểm tra với p date_json Đây là những gì tôi nhận được cho một chuỗi thực sự "{\" năm \ ": 2013, \" mon \ ": 7, \" mday \ ": 16, \" giờ \ ": 13, \ "min \": 54, \ "sec \": 32, \ "vùng \": \ "- 05:00 \", \ "offset \": - 18000} "để bạn có thể thấy rằng nó đang thực hiện ký hiệu chính là chuỗi và tất nhiên dữ liệu đó là không thay đổi. Cảm ơn một lần nữa. Xin lỗi tôi rất muộn.
Douglas G. Allen

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

puts {hash: 123}.to_json

6

Bạn cũng có thể sử dụng JSON.generate:

require 'json'

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

Hoặc bí danh của nó , JSON.unparse:

require 'json'

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

3

Thêm dòng sau vào đầu tệp của bạn

require 'json'

Sau đó, bạn có thể sử dụng:

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

Ngoài ra, bạn có thể sử dụng:

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

-1

Bạn nên bao gồm jsontrong tập tin của bạn

Ví dụ,

require 'json'

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

Để biết thêm kiến ​​thức về jsonbạn có thể truy cập liên kết dưới đây. Học hỏi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.