これは私のコードです:
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で文字列日付形式が必要ですが、どうすればよいですか?
いいえ、プレーンなJSONを生成することはできません。 リンク を参照してください。
ただし、2つのモードでJSONを生成できます。
1)厳密モード-すでに取得している出力
2)シェルモード
シェルモード:-
JsonWriterSettings writerSettings = new JsonWriterSettings(JsonMode.Shell, true);
System.out.println(doc.toJson(writerSettings));
出力:-
"createdOn" : ISODate("2016-07-16T16:26:51.951Z")
悲しいことに、IMO、MongoDB Javaサポートが壊れています。
そうは言っても、mongo-Java-driverには、使用できる_@deprecated
_クラスがあります。
_String json = com.mongodb.util.JSON.serialize(document);
System.out.println("JSON serialized Document: " + json);
_
これを使用して、Document
オブジェクトからfastxml(jackson)互換のJSONを生成し、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
_メソッドを使用するためだけに使用しています。
理論的には、toJSON()
per ...を使用することになっています... https://jira.mongodb.org/browse/Java-177
ただし、少なくとも3.6まで、toJSON()
は、_AggregateIterable<Document>
_オブジェクトの出力など、古いJSON.serialize()
メソッドが問題なく処理したさまざまなタイプでサポートされていないようですaggregate()
による。
ここにあなたの質問に正確に答えるための2020年の更新があります、すなわちこの正確なフォーマットを取得します:
"modified":"2016-07-16T16:26:51.951Z"
NotionquestのようなwriterSettingsを使用する必要がありますが、カスタム日付コンバーターと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())