Преобразование документа Bson в Json в Java

#java #json #mongodb #bson

#java #json #mongodb #bson

Вопрос:

Это мой код:

 MongoDBSingleton dbSingleton = MongoDBSingleton.getInstance();
MongoDatabase db;

try {
    db = dbSingleton.getTestdb();
    MongoIterable<String> mg = db.listCollectionNames();
    MongoCursor<String> iterator=mg.iterator();

    while (iterator.hasNext()) {
        MongoCollection<Document> table = db.getCollection(iterator.next());

        for (Document doc: table.find()) {  
            System.out.println(doc.toJson());
        }
    }

}
  

Это вывод toJson :

 "modified" : { "$date" : 1475789185087}
  

Это мой вывод toString :

 {"modified":"Fri Oct 07 02:56:25 IST 2016"}
  

Я хочу формат строки даты в Json, как это сделать?

Комментарии:

1. Какова ваша версия mongo и версия драйвера Java?

2. Мой монго — 3.2, а драйвер — 3.3

Ответ №1:

К сожалению, IMO, поддержка Java MongoDB нарушена.

Тем не менее, в @deprecated mongo-java-driver есть класс, который вы можете использовать:

 String json = com.mongodb.util.JSON.serialize(document);
System.out.println("JSON serialized Document: "   json);
  

Я использую это для создания JSON, совместимого с fasterxml (jackson), из Document объекта, с помощью которого я могу десериализовать new ObjectMapper().readValue(json, MyObject.class) .

Однако я не уверен, что они ожидают, что вы будете использовать сейчас, JSON когда класс устарел. Но на данный момент он все еще находится в проекте (начиная с версии v3.4.2).

Я импортирую следующее в свой pom:

 <dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongodb-driver-async</artifactId>
  <version>3.4.2</version>
</dependency>
<!-- Sadly, we need the mongo-java-driver solely to serialize
     Document objects in a sane manner -->
<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.4.2</version>
</dependency>
  

Я использую асинхронный драйвер для фактической выборки и отправки обновлений в mongo, а не асинхронный драйвер исключительно для использования JSON.serialize метода.

Комментарии:

1. Я использую String id = ObjectId.get().toHexString(); , а не сохраняю ObjectId напрямую.

Ответ №2:

Нет, невозможно создать простой JSON. Пожалуйста, обратитесь по этой ссылке.

Однако он может создавать JSON в двух режимах.

1) Строгий режим — вывод, который вы уже получили

2) Режим оболочки

Режим оболочки:-

 JsonWriterSettings writerSettings = new JsonWriterSettings(JsonMode.SHELL, true);           
System.out.println(doc.toJson(writerSettings));
  

Вывод:-

 "createdOn" : ISODate("2016-07-16T16:26:51.951Z")
  

MongoDB расширил JSON

Комментарии:

1. но как преобразовать это «CreatedOn»: ISODate(«2016-07-16T16:26:51.951Z») в Date(),

Ответ №3:

Теоретически мы должны использовать toJSON() per… https://jira.mongodb.org/browse/JAVA-1770

Однако, похоже, что, по крайней мере, до версии 3.6, toJSON() не поддерживается для различных типов, которые старый JSON.serialize() метод обрабатывал без проблем, таких как AggregateIterable<Document> объекты, выводимые с помощью aggregate() .

Ответ №4:

Вот обновление 2020 года, чтобы точно ответить на ваш вопрос, то есть получить именно этот формат:

 "modified":"2016-07-16T16:26:51.951Z"
  

Вы должны использовать настройки записи, подобные предложенным notionquest, но с пользовательским преобразователем даты и DateTimeFormatter.ISO_INSTANT:

 public class JsonDateTimeConverter implements Converter<Long> {

    private static final Logger LOGGER = LoggerFactory.getLogger(JsonDateTimeConverter.class);
    static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT
        .withZone(ZoneId.of("UTC"));

    @Override
    public void convert(Long value, StrictJsonWriter writer) {
        try {
            Instant instant = new Date(value).toInstant();
            String s = DATE_TIME_FORMATTER.format(instant);
            writer.writeString(s);
        } catch (Exception e) {
            LOGGER.error(String.format("Fail to convert offset %d to JSON date", value), e);
        }
    }
}
  

Используйте его следующим образом:

 doc.toJson(JsonWriterSettings
            .builder()
            .dateTimeConverter(new JsonDateTimeConverter())
            .build())
  

Ответ №5:

если bson.jar версия есть> 3.0.0 вы можете попробовать document.toJson()

Ответ №6:

Я использовал следующее

 try {

            MongoDatabase db = mongoClient.getDatabase("dbname");

            MongoCollection<Document> collection = db.getCollection("nameofcollect");

            Gson gson = new Gson();

            ArrayList<JsonObject> array = new ArrayList<JsonObject>();


            String jsonString = null;
            /*WARNING Gson lib serialize string ->means add slash if you convert "json string" into "json string"*/
            for (Document doc : collection.find()) {
                 jsonString = gson.toJson(doc);              
                 array.add(new Gson().fromJson(jsonString, JsonObject.class));
            }

            //String finalarry = gson.toJson(array);

            Map<Object, ArrayList<JsonObject>> seedMap = new HashMap<Object, ArrayList<JsonObject>>();
            // String encode = coCoRy.encryptAndEncode(jsonString);
            seedMap.put("seed", array);     
            String seedJsonString = gson.toJson(seedMap);

            mongoClient.close();

            return seedJsonString;


        } catch (MongoException | ClassCastException e) {
            e.printStackTrace();
            return null;
        }
  

Результат будет выглядеть следующим образом

 {
    "seed": [
        {
            "_id": {
                "timestamp": 1590914828,
                "counter": 10457170,
                "randomValue1": 5587428,
                "randomValue2": -25784
            },
            "FIR_EVID_NUM": "3436345346",
            "FIR_REG_NUM": "89678967",
            "LOGIN_ID": "pc_admin",
            "MEDIA_PATH": "C:\Users\ALPHAMALE\Documents\ShareX\Screenshots\2020-05\1590211570.png"
        },
        {
            "_id": {
                "timestamp": 1590924463,
                "counter": 7254997,
                "randomValue1": 5012578,
                "randomValue2": 24700
            },
            "FIR_EVID_NUM": "999999",
            "FIR_REG_NUM": "888888",
            "LOGIN_ID": "32323",
            "MEDIA_PATH": "C:/uploads/c46847c7e2d130ffd746c789c0f0932e.png"
        }
    ]
}
  

Ответ №7:

попробуйте это:

 final JsonWriterSettings settings = JsonWriterSettings.builder( ).outputMode( JsonMode.SHELL ).build( );

System.out.println(doc.toJson(settings));
  

Вы можете изменить режим JSON по своему усмотрению