2011-01-23 42 views
5

Tôi đang tìm hiểu cách phân tích cú pháp và tạo JSON bằng đá quý JSON. Tôi có thể dễ dàng tạo ra một băm dữ liệu và tạo ra dữ liệu đó thành JSON; Tuy nhiên, tôi đang có một rắm não khi nói đến việc lấy một thể hiện của một lớp (chẳng hạn như một cá thể Person) và đặt tất cả các biến cá thể của nó bên trong một băm được chuyển đổi thành JSON.Chuyển đổi đối tượng tùy chỉnh sang JSON bằng cách sử dụng đá quý JSON

Đây là ví dụ tôi đang gặp rắc rối với:

require "json" 

class Person 

    def initialize(name, age, address) 
    @name = name 
    @age = age 
    @address = address 
    end 

    def to_json 

    end 


end 

p = Person.new('John Doe', 46, "123 Elm Street") 
p.to_json 

Tôi muốn tạo ra một phương pháp .to_json vì vậy mà tôi có thể mất một đối tượng người và có tất cả các biến cá thể của nó chuyển thành JSON. Những gì tôi nghĩ rằng tôi cần làm là lấy tất cả các biến cá thể của Person, đặt chúng vào một hash sau đó gọi JSON.generate(hash). Tôi đang có một rắm não về cách làm điều đó ngay bây giờ. Vì vậy, ai đó có thể giúp tôi hoàn thành phương pháp to_json, hoặc có lẽ đề xuất một cách tốt hơn để thực hiện nó? Cảm ơn!

+0

Nếu bạn đang sử dụng Rails trợ giúp được thực hiện cho bạn đã và bạn có thể dễ dàng có được những gì bạn muốn chạy ' .to_hash' hoặc' .to_json'. Hãy xem qua nguồn của tôi cho tác vụ 'author_list': https://github.com/shybovycha/strong-sword/blob/master/app/controllers/quotes_controller.rb#L29 – shybovycha

Trả lời

11

Trước tiên, bạn cần phải chắc chắn rằng bạn sử dụng cấu trúc cơ bản đúng:

def to_json(*a) 
    { 
    'json_class' => self.class.name, 
    'data'   => Your data 
    }.to_json(*a) 
end 

Mấu chốt json_class được sử dụng bởi các đá quý JSON để xác định những gì để vượt qua lớp dữ liệu đến. Tham số *a bao gồm tất cả các đối số mà đá quý JSON chuyển vào, thường không quan trọng đối với các lớp của bạn, do đó bạn chỉ cần chuyển nó thẳng vào cuộc gọi to_json của hàm băm. Tiếp theo những cách đơn giản nhất để lưu trữ dữ liệu của bạn là một băm hoặc một mảng:

'data'   => [@name, @age, @address] 

hoặc

'data'   => { 'name' => @name, 'age' => @age, 'address' => @address 

Đầu tiên có thể là nhanh hơn và làm cho các phương pháp self.json_create hơi dễ dàng hơn để viết, trong khi thứ hai là một dễ dàng hơn nhiều để tương thích ngược nếu bạn thay đổi cấu trúc dữ liệu và muốn tải các đối tượng JSON cũ.

Các vấn đề liên quan