Bson - How to convert JSON to List<Document> and List<Document> to JSON?

Thematrixme picture Thematrixme · Jul 13, 2015 · Viewed 15.2k times · Source

I'm using Java Driver 3.0 with MongoDB in order to send JSONs through a webservice.

When I want to convert a Document object (org.bson.Document) to JSON, I use obj.toJson(), and when I want to convert a JSON to a Document object, I use Document.parse(json).

However when I'm dealing with lists of Documents (represented like this in JSON:[{"field1":1, ...}, {"field1":2, ...}]), I can't figure out a clean way of doing these conversions.

So far, I've come up with these "hacks":

  • From List to JSON: I add the list of documents as a value of a field called "list" in a bigger document. I convert this big document to JSON, and remove what I don't need from the obtained String.

    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);
    }
    
  • From JSON to List: I do the opposite by adding this "list" field to the JSON, converting it to a Document and getting only the value of this field from the Document.

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

I also tried to use another JSON serializer (I took Google's one), but it doesn't give the same result as the built-in toJson() method from the Document object, particularly for the "_id" field or the timestamps.

Is there any clean way of doing this?

Answer

Blakes Seven picture Blakes Seven · Jul 13, 2015

The com.mongodb.util.JSON package is "still" not deprecated and does handle lists of DBObject quite well. You just need to do a little converting:

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

And there is nothing wrong with adding that "list" to another DBObject wih the key "list" as used in your output. Otherwise you can delve into using another JSON parser and feeding each document from the cursor iterator into that.

It depends on the size of your input, but while this still works it sure looks a lot cleaner in code.