2010-05-30 3 views
8

J'essaye de faire un service web en utilisant Ruby Sinatra et MongoDB. Il retournera les objets JSON. J'ai décidé d'utiliser MongoDB, en partie, car il stocke les documents en interne dans une structure "JSON-like". Je pensais que cela me faciliterait l'exécution d'une requête et l'envoi d'un résultat JSON au client. Cependant, j'ai rencontré des problèmes de conversion des résultats de MongoDB en JSON.Dans Ruby, MongoDB renvoie un BSON :: OrderedHash. Comment puis-je le convertir en JSON? L'utilisation de to_json donne une erreur "stack level too deep"

La fonction find_one() de MongoDB renvoie un BSON :: OrderedHash. Du documentation il semble que cela devrait se comporter comme le type de Hash de Ruby. Lorsque j'essaye de le convertir en JSON en utilisant la fonction .to_json, j'obtiens une erreur "niveau de pile trop profond". Essayer de convertir une œuvre identique fonctionne très bien.

Ce code fonctionne comme j'attendre:

require "json" 

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

puts my_hash.to_json 

Ce code produit `to_json ': niveau de pile trop profond (SystemStackError):

require "json" 
require "bson" 

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

puts my_bson.to_json 

Essayer de convertir en hachage premier n'a pas Aidez-moi. Même erreur Pourquoi est-ce que le niveau de la pile est trop élevé? Pourquoi? Ceci est un hachage simple. Est-il facile de convertir les résultats de MongoDB en JSON? Je ne veux pas écrire une fonction de conversion spécifique à mes données. Cela vainc le point d'avoir une base de données schemaless.

+0

Heh. Au début, je pensais que "BSON" dans le titre était une faute de frappe. Apprendre quelque chose de nouveau chaque jour. – Matchu

+0

Vos exemples fonctionnent avec ma configuration actuelle dans irb. J'ai 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). Est-ce que l'erreur avec bsons normal ou seulement avec ceux obtenus à partir d'une base de données MongoDB? – ponzao

+0

Je n'ai pas pu obtenir bson_ext pour construire sur mon système, donc j'utilise simplement bson. Vous pouvez essayer sans bson_ext? Peut-être que cela explique la différence? Est-ce que quelqu'un sait s'il existe une version binaire Windows de bson_ext disponible quelque part afin que je puisse éviter la peine d'essayer de l'obtenir pour construire? –

Répondre

3

Essayez cette solution de contournement:

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 
Questions connexes