2010-05-30 21 views
8

Tôi đang cố gắng tạo một dịch vụ web bằng cách sử dụng Ruby Sinatra và MongoDB. Nó sẽ trả về các đối tượng JSON. Tôi quyết định sử dụng MongoDB, một phần, bởi vì nó lưu trữ các tài liệu nội bộ trong một cấu trúc "giống như JSON". Tôi nghĩ điều này sẽ giúp tôi dễ dàng chạy một truy vấn và gửi kết quả JSON đến máy khách. Tuy nhiên, tôi đã gặp phải các vấn đề khi chuyển đổi kết quả từ MongoDB thành JSON.Trong Ruby, MongoDB trả về BSON :: OrderedHash. Làm cách nào để chuyển đổi nó sang JSON? Sử dụng to_json cung cấp cho một lỗi "chồng mức quá sâu"

find_one() trả về BSON :: OrderedHash. Từ documentation có vẻ như nó sẽ hoạt động tương tự như kiểu Hash của Ruby. Khi tôi cố gắng chuyển đổi nó thành JSON bằng cách sử dụng hàm .to_json, tôi nhận được lỗi "mức xếp chồng quá sâu". Đang cố gắng chuyển đổi một tác phẩm giống hệt tốt.

Mã này hoạt động giống như tôi mong chờ:

require "json" 

my_hash = Hash.new 
my_hash[ "a" ] = "aaa" 
my_hash[ "b" ] = 9 

puts my_hash.to_json 

Mã này tạo ra 'to_json': ngăn xếp mức quá sâu (SystemStackError):

require "json" 
require "bson" 

my_bson = BSON::OrderedHash.new 
my_bson[ "a" ] = "aaa" 
my_bson[ "b" ] = 9 

puts my_bson.to_json 

Đang cố gắng để chuyển đổi để băm đầu tiên không Cứu giúp. Lỗi tương tự.

puts my_bson.to_hash.to_json 

Tại sao tôi nhận được lỗi mức quá mức ngăn xếp? Đây là một băm đơn giản. Có dễ dàng chuyển đổi các kết quả MongoDB thành JSON không? Tôi không muốn viết hàm chuyển đổi cụ thể cho dữ liệu của mình. Điều đó đánh bại điểm có một cơ sở dữ liệu schemaless.

+0

Heh. Lúc đầu, tôi nghĩ "BSON" trong tiêu đề là một lỗi đánh máy. Học điều mới mỗi ngày. – Matchu

+0

Ví dụ của bạn đang làm việc với thiết lập hiện tại của tôi trong irb. Tôi có ruby ​​1.8.7 (2010-01-10 patchlevel 249) [i486-linux], irb 0.9.5 (05/04/13), bson (1.0.1), bson_ext (1.0.1). Có lỗi với bsons bình thường hay chỉ với những cái được lấy từ cơ sở dữ liệu MongoDB? – ponzao

+0

Tôi đã không thể có được bson_ext để xây dựng trên hệ thống của tôi vì vậy tôi chỉ sử dụng bson. Bạn có thể thử mà không cần bson_ext? Có lẽ đó là sự khác biệt? Có ai biết nếu có một phiên bản nhị phân cửa sổ của bson_ext có sẵn ở đâu đó để tôi có thể tránh được nỗi đau khi cố gắng xây dựng nó? –

Trả lời

3

Hãy thử cách này:

class BSON::OrderedHash 
    def to_h 
    inject({}) { |acc, element| k,v = element; acc[k] = (if v.class == BSON::OrderedHash then v.to_h else v end); acc } 
    end 

    def to_json 
    to_h.to_json 
    end 
end 
Các vấn đề liên quan