【问题标题】: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());

据我了解,这将:

  1. 将文档转换为字符串
  2. 解析字符串并创建 JsonNode 对象

我注意到 Jackson Project - jackson-datatype-mongoBSON 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、DBObjectBsonDocumenttoBson 的转换,反之亦然,这将大大简化整个过程.

    【讨论】:

      【解决方案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\"}");
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-03
        • 1970-01-01
        • 2017-01-16
        • 2014-05-23
        • 2013-05-23
        • 2012-07-17
        相关资源
        最近更新 更多