2011-05-26 47 views
4

我试图从查询MongoDB实例并将响应解析为Java对象的REST服务中获取响应。 Web服务返回MIME类型为html的响应,并用换行符分隔每个返回的记录(尽管我有能力调整服务返回的内容)。将BSON响应转换为Java对象最简单/最有效的方法是什么?我已经在Java中创建了一个模板类来存储数据。反序列化MongoDB BSON

在此先感谢!

编辑:一位同事向我建议在webservice本身使用MongoDB Java驱动程序的BSON解析工具,然后返回一个格式良好的HTML字符串。这仍然让我在我的应用程序中进行解析,但是将暂时用作解决方法。仍在寻找一种轻松反序列化对Java对象的BSON响应的方法。

+1

重复的:http://stackoverflow.com/questions/3656335/bson-library-for-java有一些答案 – 2011-05-26 22:14:54

+0

模板对象的形式是什么?它只是一个POJO? – 2011-05-27 04:18:15

+0

模板是一个带有嵌套类的Java对象,用于模拟BSON文档的结构。我可以调整模板的结构,以便存储来自Mongo的数据。 – 2011-05-27 14:42:33

回答

1

对于那些有兴趣的人,我找到了解决我的问题的方法。事实证明,BSON格式可以像使用Google's GSON driver.一样被解析。我必须处理的一个棘手的部分是想办法将嵌套字段存储在我的模板类中。允许GSON解析嵌套文档的方法是在模板类中声明静态内部类。这里有一个例子:

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 
    } 

声明模板类按照上述框架,让我轻松地分析MongoDB的使用几行代码从GSON库格式。请注意,我串接一个“\ n”来的每个条目从我的web服务返回的数据时,以在蒙戈的BSON响应每个文档分开:

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

你确定这可以吗? Mongo中的BSONObject没有默认构造函数 - 在这种情况下gson需要。 – Spedge 2011-11-23 15:55:22

+0

我的错误 - 你应该在模板类中声明一个默认构造函数。 – 2011-11-26 22:49:59