【问题标题】:How to directly convert MongoDB Document do Jackson JsonNode in Java如何在 Java 中直接将 MongoDB Document 转换为 Jackson JsonNode
【发布时间】:2018-03-13 17:39:12
【问题描述】:
我想将 MongoDB 文档 (org.bson.Document) 存储为 Jackson JsonNode 文件类型。这个问题有一个过时的答案here,受此启发,我能够成功地解析文档
ObjectMapper mapper = new ObjectMapper();
...
JonNode jsonData = mapper.readTree(someBsonDocument.toJson());
据我了解,这将:
- 将文档转换为字符串
- 解析字符串并创建 JsonNode 对象
我注意到 Jackson Project - jackson-datatype-mongo 和 BSON for Jackson 对 MongoDB/BSON 有一些支持,但我不知道如何使用它们更有效地进行转换。
【问题讨论】:
标签:
json
mongodb
jackson
type-conversion
bson
【解决方案1】:
我能够使用 bson4jackson 找到一些解决方案:
public static InputStream documentToInputStream(final Document document) {
BasicOutputBuffer outputBuffer = new BasicOutputBuffer();
BsonBinaryWriter writer = new BsonBinaryWriter(outputBuffer);
new DocumentCodec().encode(writer, document, EncoderContext.builder().isEncodingCollectibleDocument(true).build());
return new ByteArrayInputStream(outputBuffer.toByteArray());
}
public static JsonNode documentToJsonNode(final Document document) throws IOException {
ObjectMapper mapper = new ObjectMapper(new BsonFactory());
InputStream is = documentToInputStream(document);
return mapper.readTree(is);
}
我不确定这是否是最有效的方法,我认为它仍然是比将 BSOn 转换为字符串并解析该字符串更好的解决方案。有一个 open Ticket in the mongoDB JIRA 用于添加从 Document、DBObject 和 BsonDocument 到 toBson 的转换,反之亦然,这将大大简化整个过程.
【解决方案2】:
感谢这不是 OP 所要求的 - 但可能对某些人有所帮助。我已经设法使用MongoJack 反向执行此操作。关键是使用JacksonEncoder,它可以将任何类似Json 的对象转换为Bson 对象。然后使用 BsonDocumentWriter 将其写入 BsonDocument 实例。
@Test
public void writeBsonDocument() throws IOException {
JsonNode jsonNode = new ObjectMapper().readTree("{\"wibble\": \"wobble\"}");
BsonDocument document = new BsonDocument();
BsonDocumentWriter writer = new BsonDocumentWriter(document);
JacksonEncoder transcoder =
new JacksonEncoder(JsonNode.class, null, new ObjectMapper(), UuidRepresentation.UNSPECIFIED);
var context = EncoderContext.builder().isEncodingCollectibleDocument(true).build();
transcoder.encode(writer,jsonNode,context);
Assertions.assertThat(document.toJson()).isEqualTo("{\"wibble\": \"wobble\"}");
}