2015-07-13 114 views
3

我正在使用Java驅動程序3.0與MongoDB爲了通過web服務發送JSONs。Bson - 如何將JSON轉換爲列表<Document>和列表<Document>轉換爲JSON?

當我想將Document對象(org.bson.Document)轉換爲JSON時,我使用obj.toJson(),當我想將JSON轉換爲Document對象時,我使用Document.parse(json)

但是,當我正在處理文檔列表(在JSON中表示爲這樣的代碼:[{"field1":1, ...}, {"field1":2, ...}])時,我無法弄清楚這些轉換的乾淨方式。

到目前爲止,我想出了這些「黑客」:

  • 從列表以JSON:我添加的文件清單作爲一個更大的文件中被稱爲「列表」字段的值。我將這個大文檔轉換爲JSON,並從獲得的字符串中刪除我不需要的東西。

    public String toJson(List<Document> docs){ 
        Document doc = new Document("list", docs); 
        String json = doc.toJson(); 
        return json.substring(json.indexOf(":")+2, json.length()-1); 
    } 
    
  • 從JSON列出:我加入這個「清單」字段的JSON,將其轉換爲一個文件,只從文檔得到這個字段的值則相反。

    public static List<Document> toListOfDocuments(String json){ 
        Document doc = Document.parse("{ \"list\":"+json+"}"); 
        Object list = doc.get("list"); 
        if(list instanceof List<?>) { 
         return (List<Document>) doc.get("list"); 
        } 
        return null ; 
    } 
    

我還試圖用另一種JSON序列化(我把谷歌的一個),但它不會產生相同的結果作爲內置的Document對象toJson()方法,特別是對「 _id「字段或時間戳。

有沒有乾淨的方式做到這一點?

回答

5

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)); 

並沒有什麼錯,並稱「清單」到另一個DBObject王氏在你的輸出使用的鍵「列表」。否則,您可以深入研究使用另一個JSON解析器並將光標迭代器中的每個文檔提供給該解析器。

這取決於您的輸入的大小,但雖然這仍然有效,它肯定看起來更清潔的代碼。

+0

感謝您的回答,但我不知道是否有一個,就是爲駕駛員3.0的解決方案。 但無論如何,我不知道我可以使用BasicDB而不是DBObject,所以謝謝。我想我可以做相反的轉換從JSON到列表? – Thematrixme

+0

@Thematrixme你讀過「不被棄用」的聲明嗎?這意味着它適用於當前的驅動程序。外部庫還有其他方法。但不是。沒有更新的「util」包可以與BSON'Document'本身一起工作。只需投射類型。 –

+0

我知道棄用的意味着什麼,我只是擔心這會在下一個版本中被刪除,就像您提到的「仍然不被棄用」一樣,而且我會喜歡本機意味着用於驅動程序3.0的解決方案。然而,由於目前還沒有這樣的事情,你的答案似乎是正確的。謝謝! – Thematrixme

1

有驅動程序3.0的解決方案。

您遵循以下步驟:

BasicDBObject dbObject = (BasicDBObject) JSON.parse("yourJsonString"); 
MongoCollection<BasicDBObject> table = db.getCollection("collectionName", BasicDBObject.class); 
table.insertOne(dbObject);