2015-07-13 2 views
3

Я использую Java Driver 3.0 с MongoDB для отправки JSON через веб-сервис.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 (я взял Google, один), но это не дает тот же результат, встроенный в toJson() методе из объекта Document, в частности, для " _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. Но так или иначе, я не знал, что могу использовать BasicDBList с документами вместо 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); 
Смежные вопросы