【问题标题】:Deserializing MongoDB BSON反序列化 MongoDB BSON
【发布时间】:2011-09-02 21:30:12
【问题描述】:

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

提前致谢!

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

【问题讨论】:

  • 模板对象的形式是什么?它只是一个 POJO 吗?
  • 模板是一个带有嵌套类的 Java 对象,用于模仿 BSON 文档的结构。我可以将模板的结构调整为最方便存储来自 Mongo 的数据的结构。

标签: java serialization rest mongodb bson


【解决方案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 的格式。请注意,当我从我的网络服务返回数据时,我在每个条目上连接了一个“\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();
}

【讨论】:

  • 你确定这行得通吗? Mongo 中的 BSONObject 没有默认构造函数 - 在这种情况下 gson 需要它。
  • 我的错误 - 您应该在模板类中声明一个默认构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2016-02-14
相关资源
最近更新 更多