将MongoDB 3中的Document对象转换为POJOS

Ale*_*lex 13 java json mongodb mongodb-java

我将一个带有java.util.Date字段的对象保存到MongoDB 3.2实例中.

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject);
collection.insertOne(Document.parse(json));
Run Code Online (Sandbox Code Playgroud)

字符串包含:

"captured": 1454549266735
Run Code Online (Sandbox Code Playgroud)

然后我从MongoDB实例中读取它:

    final Document document = collection.find(eq("key", value)).first();
    final String json = document.toJson();
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    xx = mapper.readValue(json, MyClass.class);
Run Code Online (Sandbox Code Playgroud)

反序列化失败:

java.lang.RuntimeException:com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.util.Date的实例

我看到"document.toJson()"创建的json字符串包含:

"captured": {
    "$numberLong": "1454550216318"
}
Run Code Online (Sandbox Code Playgroud)

而不是最初的("捕获":1454549266735)MongoDB文档说他们开始使用"MongoDB Extended Json".我试过杰克逊1和2解析它 - 没有运气.

将MongoDB 3提供的Document对象转换为Java POJO的最简单方法是什么?也许我可以完全跳过Json()步骤?

我试过mongojack - 那个不支持MongoDB3.

看看MongoDB文档页面上列出的其他几个POJO映射器 - 它们都需要将自定义注释放到Java类中.

cai*_*cuk 13

您应该定义并使用自定义JsonWriterSettings来微调JSON生成:

 JsonWriterSettings settings = JsonWriterSettings.builder()
         .int64Converter((value, writer) -> writer.writeNumber(value.toString()))
         .build();

 String json = new Document("a", 12).append("b", 14L).toJson(settings);
Run Code Online (Sandbox Code Playgroud)

会产生:

 { "a" : 12, "b" : 14 }
Run Code Online (Sandbox Code Playgroud)

如果您不使用自定义设置,那么文档将生成扩展的json:

 { "a" : 12, "b" : { "$numberLong" : "14" } }
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的潜在问题是,大的long值可能会失去精度。一些JSON实现仅使用double。它们的尾数为52位,比长尾数少12位。幸运的是,以毫秒为单位的时间仅需要31位,因此在很多情况下(143,000年),我们将避免使用该时间,但是请注意! (2认同)

Ale*_*lev 4

这看起来像Mongo Java驱动程序错误,即使使用JsonMode.STRICT,Document.toJson也会使用非标准JSON.以下错误https://jira.mongodb.org/browse/JAVA-2173中描述了此问题,我建议您投票.

解决方法是使用com.mongodb.util.JSON.serialize(document).

  • com.mongodb.util.JSON.serialize(document)在新版本中已弃用 (2认同)