问题:Bson - 如何将 JSON 转换为 List<Document> 并将 List<Document> 转换为 JSON?

我将 Java Driver 3.0 与 MongoDB 一起使用,以便通过 Web 服务发送 JSON。

当我想将 Document 对象(org.bson.Document)转换为 JSON 时,我使用obj.toJson(),当我想将 JSON 转换为 Document 对象时,我使用Document.parse(json)

但是,当我处理文档列表(在 JSON:[{"field1":1, ...}, {"field1":2, ...}]中表示为这样)时,我无法找到一种干净的方式来进行这些转换。

到目前为止,我已经想出了这些“黑客”:

  • 从列表到 JSON:我将文档列表添加为更大文档中名为“列表”的字段的值。我将这个大文档转换为 JSON,并从获得的字符串中删除我不需要的内容。
公共字符串 toJson(List<Document> 文档){
文档 doc u003d new Document("list", docs);
字符串 json u003d doc.toJson();
返回 json.substring(json.indexOf(":")+2, json.length()-1);
}
  • 从 JSON 到列表:我通过将这个“列表”字段添加到 JSON 中,将其转换为文档并仅从文档中获取此字段的值来做相反的事情。
公共静态列表<Document> toListOfDocuments(String json){
文档 doc u003d Document.parse("{ \"list\":"+json"}");
对象列表 u003d doc.get("list");
if(list instanceof List<?>) {
return (List<Document>) doc.get("list");
}
返回空值;
}

我还尝试使用另一个 JSON 序列化程序(我使用了 Google 的序列化程序),但它给出的结果与 Document 对象的内置toJson()方法不同,特别是对于“_id”字段或时间戳。

有什么干净的方法可以做到这一点吗?

解答

com.mongodb.util.JSON包“仍然”没有被弃用,并且可以很好地处理DBObject的列表。你只需要做一点转换:

    MongoClient client = new MongoClient(new ServerAddress("192.168.2.4", 27017));

    MongoDatabase db = client.getDatabase("test");

    MongoCollection<Document> collection = db.getCollection("sample");

    MongoCursor<Document> iterator = collection.find().iterator();

    BasicDBList list = new BasicDBList();
    while (iterator.hasNext()) {
        Document doc = iterator.next();
        list.add(doc);
    }
    System.out.println(JSON.serialize(list));

使用输出中使用的键“list”将该“列表”添加到另一个DBObject并没有错。否则,您可以深入研究使用另一个 JSON 解析器并将游标迭代器中的每个文档输入其中。

这取决于您输入的大小,但是虽然这仍然有效,但它确实在代码中看起来更清晰。

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐