2010-05-30 12 views
8

Próbuję utworzyć usługę sieciową przy użyciu Ruby Sinatra i MongoDB. Zwróci obiekty JSON. Zdecydowałem się po części użyć MongoDB, ponieważ przechowuje on dokumenty wewnętrznie w strukturze "podobnej do JSON". Pomyślałem, że to ułatwi mi uruchomienie zapytania i wysłanie wyniku JSON do klienta. Jednak mam problemy z konwersją wyników z MongoDB na JSON.W Rubim, MongoDB zwraca BSON :: OrderedHash. Jak przekonwertować go na JSON? Używanie to_json daje błąd "zbyt dużego poziomu stosu"

MongoDB's find_one() zwraca BSON :: OrderedHash. Od documentation wydaje się, że powinno to wyglądać podobnie do typu Hash Rubiego. Kiedy próbuję przekonwertować go do JSON za pomocą funkcji .to_json, otrzymuję błąd "zbyt dużo poziomów stosu". Próba przekonwertowania identycznych utworów jest w porządku.

Ten kod działa jak bym się spodziewał:

require "json" 

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

puts my_hash.to_json 

Ten kod generuje `to_json ': poziom stosu zbyt głębokie (SystemStackError):

require "json" 
require "bson" 

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

puts my_bson.to_json 

próbujesz konwertować do mieszania najpierw nie Wsparcie. Ten sam błąd.

puts my_bson.to_hash.to_json 

Dlaczego otrzymuję zbyt duży błąd poziomu stosu? To jest prosty hasz. Czy można łatwo przekonwertować wyniki MongoDB na JSON? Nie chcę pisać funkcji konwersji, która jest specyficzna dla moich danych. To pokonuje punkt, w którym znajduje się baza danych bez schematów.

+0

He. Na początku myślałem, że "BSON" w tytule to literówka. Naucz się czegoś nowego każdego dnia. – Matchu

+0

Twoje przykłady działają z moją obecną konfiguracją w irb. Mam 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). Czy błąd dotyczy zwykłych bsonów, czy tylko tych, które zostały pobrane z bazy danych MongoDB? – ponzao

+0

Nie byłem w stanie uzyskać bson_ext do zbudowania na moim systemie, więc używam tylko basha. Możesz spróbować bez bson_ext? Może to wyjaśnia różnicę? Czy ktoś wie, czy jest dostępna binarna wersja bson_ext systemu Windows, więc mogę uniknąć bólu, próbując go zbudować? –

Odpowiedz

3

Spróbuj tego rozwiązania:

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