web-dev-qa-db-fra.com

Document Bson à Json en Java

Voici mon code:

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

}

Voici la sortie de toJson:

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

Voici ma sortie de toString:

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

Je veux le format de date String dans Json, comment le faire?

7
Bharath Karnam

Non, il n'est pas possible de produire le JSON ordinaire. Veuillez vous référer à ceci lien .

Cependant, il peut produire du JSON en deux modes.

1) Mode strict - Sortie que vous avez déjà

2) Mode Shell

Mode Shell: -

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

Sortie: -

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

MongoDB JSON étend

4
notionquest

Malheureusement, IMO, MongoDB Java support est cassé.

Cela dit, il existe une classe @deprecated Dans le pilote mongo-Java que vous pouvez utiliser:

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

J'utilise ceci pour produire un JSON compatible plus rapide xml (jackson) à partir d'un objet Document que je peux désérialiser via new ObjectMapper().readValue(json, MyObject.class).

Cependant, je ne sais pas ce qu'ils attendent de vous maintenant que la classe JSON est déconseillée. Mais pour l'instant, il est toujours dans le projet (à partir de la v3.4.2).

J'importe les éléments suivants dans mon 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>

J'utilise le pilote asynchrone pour récupérer et pousser les mises à jour vers mongo, et le pilote non asynchrone uniquement pour l'utilisation de la méthode JSON.serialize.

5
Shadow Man

En théorie, nous sommes censés utiliser toJSON() par ... https://jira.mongodb.org/browse/Java-177

Cependant, il semble que, au moins jusqu'à 3.6, toJSON() n'est pas pris en charge sur divers types l'ancienne méthode JSON.serialize() gérée sans problème, comme les objets AggregateIterable<Document> sortie par aggregate().

2
Kenneth M. Kolano

Voici une mise à jour 2020 pour répondre exactement à votre question, c'est-à-dire obtenir ce format exact:

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

Vous devez utiliser writerSettings comme suggéré par notionquest, mais avec un convertisseur de date personnalisé et 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);
        }
    }
}

Utilisez-le comme ceci:

doc.toJson(JsonWriterSettings
            .builder()
            .dateTimeConverter(new JsonDateTimeConverter())
            .build())
0
Benjamin Caure