我想将MongoDB文档(org.bson.Document)存储为Jackson JsonNode文件类型。对此问题有一个过时的答案here,受此启发,我能够成功解析文档
ObjectMapper mapper = new ObjectMapper();
...
JonNode jsonData = mapper.readTree(someBsonDocument.toJson());
根据我的理解,这将:
我注意到Jackson Project - jackson-datatype-mongo和BSON for Jackson对MongoDB / BSON有一些支持,但我无法弄清楚如何使用它们来更有效地进行转换。
答案 0 :(得分: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转换为String并解析该字符串更好的解决方案。有一个open Ticket in the mongoDB JIRA用于添加从 Document,DBObject 和 BsonDocument 到 toBson 的转换,反之亦然,这将简化整个过程很多。
答案 1 :(得分:0)
感谢这不是 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\"}");
}