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?
There is solution for driver 3.0.
You follow the following steps:
The
com.mongodb.util.JSON
package is "still" not deprecated and does handle lists ofDBObject
quite well. You just need to do a little converting: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.