反序列化MongoDB BSON

时间:2011-05-26 19:33:37

标签: java serialization rest mongodb bson

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

提前致谢!

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

1 个答案:

答案 0 :(得分:1)

对于那些感兴趣的人,我找到了解决问题的方法。事实证明,使用Google's GSON driver.可以像使用JSON一样解析BSON格式。我必须处理的一个棘手的部分是想出一种在我的模板类中存储嵌套字段的方法。允许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
  }

按照上面的框架声明模板类允许我使用GSON库中的几行代码轻松解析MongoDB的格式。请注意,当我从webservice返回数据时,我将每个条目的“\ n”连接起来,以便将Mongo的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();
}