web-dev-qa-db-ja.com

JavaのJsonへの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で文字列日付形式が必要ですが、どうすればよいですか?

7
Bharath Karnam

いいえ、プレーンな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")

MongoDB拡張JSON

4
notionquest

悲しいことに、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_メソッドを使用するためだけに使用しています。

5
Shadow Man

理論的には、toJSON() per ...を使用することになっています... https://jira.mongodb.org/browse/Java-177

ただし、少なくとも3.6まで、toJSON()は、_AggregateIterable<Document>_オブジェクトの出力など、古いJSON.serialize()メソッドが問題なく処理したさまざまなタイプでサポートされていないようですaggregate()による。

2

ここにあなたの質問に正確に答えるための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())
0
Benjamin Caure