2010-05-30 2 views
8

Я пытаюсь сделать веб-сервис с помощью Ruby Sinatra и MongoDB. Он вернет объекты JSON. Я решил использовать MongoDB, частично, потому что он хранит документы внутри структуры «JSON-like». Я думал, что это облегчит мне выполнение запроса и отправку результата JSON клиенту. Тем не менее, у меня возникли проблемы с преобразованием результатов от MongoDB в JSON.В Ruby MongoDB возвращает BSON :: OrderedHash. Как преобразовать его в JSON? Использование to_json дает ошибку «слишком высокий уровень стека»

MongoDB find_one() возвращает BSON :: OrderedHash. Из documentation кажется, что это должно вести себя подобно типу Ruby's Hash. Когда я пытаюсь преобразовать его в JSON с помощью функции .to_json, я получаю ошибку «слишком высокий уровень стека». Попытка конвертировать одинаковые работы просто прекрасна.

Этот код работает как я хотел бы ожидать:

require "json" 

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

puts my_hash.to_json 

Этот код производит `to_json ': уровень стека слишком глубоко (SystemStackError):

require "json" 
require "bson" 

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

puts my_bson.to_json 

Попытка преобразовать в хэш-первых, не сделал Помогите. Такая же ошибка.

puts my_bson.to_hash.to_json 

Почему я получаю слишком высокий уровень стека? Это простой хеш. Легко ли преобразовать результаты MongoDB в JSON? Я не хочу писать функцию преобразования, специфичную для моих данных. Это наносит ущерб точке базы данных schemaless.

+0

Хе. Сначала я подумал, что «BSON» в названии - опечатка. Узнавайте что-то новое каждый день. – Matchu

+0

Ваши примеры работают с моей текущей настройкой в ​​irb. У меня есть 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). Выполняется ли ошибка с обычными bsons или только с теми, которые получены из базы данных MongoDB? – ponzao

+0

Мне не удалось получить bson_ext для сборки на моей системе, поэтому я просто использую bson. Вы можете попробовать без bson_ext? Может быть, это объясняет разницу? Кто-нибудь знает, есть ли доступная двоичная версия bson_ext для Windows, чтобы я мог избежать боли, пытаясь ее построить? –

ответ

3

Попробуйте обходной путь:

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