2011-05-26 3 views
4

Je tente d'obtenir une réponse d'un service REST qui interroge une instance de MongoDB et analyse la réponse dans un objet Java. Le service Web retourne la réponse avec un type MIME de html avec un caractère de retour à la ligne séparant chaque enregistrement qui est retourné (bien que j'ai la possibilité d'ajuster ce que le service retourne). Quel est le moyen le plus simple/le plus efficace de convertir la réponse BSON en un objet Java? J'ai déjà créé une classe de modèle en Java pour stocker les données.Désérialisation de MongoDB BSON

Merci d'avance!

edit: Un collègue m'a suggéré d'utiliser les utilitaires d'analyse BSON du pilote Java de MongoDB dans le service Web lui-même, puis de retourner une chaîne HTML bien formatée. Cela me laisse toujours avec l'analyse à faire dans mon application, mais fonctionnera comme une solution de contournement pour le moment. Toujours à la recherche d'un moyen de désérialiser facilement la réponse BSON à un objet Java.

+1

double de: http://stackoverflow.com/questions/3656335/bson-library-for-java qui a quelques réponses –

+0

Quelle est la forme de l'objet template? Est-ce juste un POJO? –

+0

Le modèle est un objet Java avec des classes imbriquées pour imiter la structure du document BSON. Je peux ajuster la structure du modèle à ce qui serait le plus pratique pour stocker les données de Mongo. –

Répondre

1

Pour ceux qui sont intéressés, j'ai trouvé la solution à mon problème. Il s'avère que le format BSON peut être analysé comme JSON en utilisant Google's GSON driver. La partie délicate que j'ai eu à traiter était de trouver un moyen de stocker des champs imbriqués dans ma classe de modèles. La façon d'autoriser GSON à analyser les documents imbriqués consiste à déclarer des classes internes statiques dans votre classe de modèle. Voici un exemple:

public BSONObject { 
    // Private fields 
    private int foo; 
    private String bar; 

    // Constructors 
    public BSONObject() {} 

    // Static inner subclasses 
    private Widget widget; 
    private Duck quack; 

    // Getters & Setters for outer class 
    public int getFoo() {...} 
    public String getBar() {...} 
    public Widget getWidget() {...} 
    public Duck getDuck() {...} 

    // Static inner class declarations 
    public static Widget { 
    // include vars & getters/setters 
    } 

etc.

Déclarant la classe modèle suivant le cadre ci-dessus m'a permis d'analyser facilement le formatage de MongoDB en utilisant quelques lignes de code de la bibliothèque GSON. S'il vous plaît noter que je CONCATENE un « \ n » à chaque entrée lors du retour des données de mon webservice de manière à séparer chaque document dans la réponse BSON de Mongo:

public String getNestedField() { 
    Gson gson = new Gson(); 
    String [] split = response.split("\n"); 
    JsonParser p = new JsonParser(); 
    String json = split[0]; 
    BSONObject b = gson.fromJson(p.parse(json), BSONObject.class); 
    return b.getWidget().getField(); 
} 
+0

Etes-vous sûr que cela fonctionne? BSONObject dans Mongo n'a pas de constructeur par défaut - dont gson a besoin dans cette instance. – Spedge

+0

Mon erreur - vous devez déclarer un constructeur par défaut dans votre classe de modèle. –

Questions connexes