将MongoDB 3中的文档对象转换为POJOS

2022-09-03 13:29:24

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

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject);
collection.insertOne(Document.parse(json));

字符串包含:

"captured": 1454549266735

然后我从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);

反序列化失败:

java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Can not deerialize instance of java.util.Date out of START_OBJECT token

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

"captured": {
    "$numberLong": "1454550216318"
}

MongoDB文档说他们开始使用“MongoDB Extended Json”,而不是最初存在的东西(“捕获”:1454549266735)。我尝试了Jackson 1和2来解析它 - 没有运气。

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

我尝试了mongojack - 那个不支持MongoDB3。

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


答案 1

您应该定义并使用自定义 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);

将产生:

 { "a" : 12, "b" : 14 }

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

 { "a" : 12, "b" : { "$numberLong" : "14" } }

答案 2

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

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