如何在Java中直接转换MongoDB Document do Jackson JsonNode

时间:2017-10-02 15:50:42

标签: json mongodb jackson type-conversion bson

我想将MongoDB文档(org.bson.Document)存储为Jackson JsonNode文件类型。对此问题有一个过时的答案here,受此启发,我能够成功解析文档

ObjectMapper mapper = new ObjectMapper();
...
JonNode jsonData = mapper.readTree(someBsonDocument.toJson());

根据我的理解,这将:

  1. 将文档转换为字符串
  2. 解析字符串并创建JsonNode对象
  3. 我注意到Jackson Project - jackson-datatype-mongoBSON for Jackson对MongoDB / BSON有一些支持,但我无法弄清楚如何使用它们来更有效地进行转换。

2 个答案:

答案 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\"}");
    }