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?
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")
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
.
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()
.
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())