Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

java

mongodb

bson

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?

like image 508
Thematrixme Avatar asked Jul 13 '15 10:07

Thematrixme


2 Answers

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.

like image 66
Blakes Seven Avatar answered Sep 30 '22 00:09

Blakes Seven


There is solution for driver 3.0.

You follow the following steps:

BasicDBObject dbObject = (BasicDBObject) JSON.parse("yourJsonString");
MongoCollection<BasicDBObject> table = db.getCollection("collectionName", BasicDBObject.class);
table.insertOne(dbObject);
like image 23
Sanchit Singhania Avatar answered Sep 29 '22 23:09

Sanchit Singhania