MongoDB "NumberLong/$numberLong" 转换回 Java 对象时出现问题

MongoDB "NumberLong/$numberLong" issue while converting back to Java Object

我有一个 json 有点像 {"Header" : {"name" : "TestData", "contactNumber" : 8019071740}}

如果我将其插入到 mongoDB 中,它将类似于

{"_id" : ObjectId("58b7e55097989619e4ddb0bb"),"Header" : {"name" : "TestData","contactNumber" : NumberLong(8019071743)}

当我读回这些数据并尝试使用 Gson 转换为 java 对象时,它抛出异常 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 109 path $.Header.contactNumber

我找到了 ,但我想知道如果我有非常复杂的 json 结构,那么我可能需要在这种方法中操纵许多 json 节点。

有没有人对此有更好的选择。

编辑:1 我正在阅读查询和转换 json 如下

Document MongoDocument = mycollection.find(searchCondition);
String resultJson =  MongoDocument.toJson();
Gson gson = new Gson();
Model model= gson.fromJson(resultJson, ItemList.class);

Mongo db 使用 Bson 格式,其自身类型遵循 json 标准,但如果不编写自定义 wrapper/codec,它就无法被 json 库解析。

您可以使用第三方 framework/plugins 让库负责文档和 pojo 之间的转换。

如果这不适合您,您将不得不自己绘制地图。

Document mongoDocument = mycollection.find(searchCondition);
Model model= new Model();
model.setProperty(mongoDocument.get("property");

看看:converting Document objects in MongoDB 3 to POJOS

我遇到了同样的问题。使用 com.mongodb.util.JSON.serialize(document) 的解决方法可以解决问题。

val mongoJsonWriterSettings: JsonWriterSettings = JsonWriterSettings.builder.int64Converter((value, writer) => writer.writeNumber(value.toString)).build
def bsonToJson(document: Document): String = document toJson mongoJsonWriterSettings

我们可以使用下面的代码:

Document doc = documentCursor.next();
JsonWriterSettings relaxed = JsonWriterSettings.builder().outputMode(JsonMode.RELAXED).build();
CustomeObject obj = gson.fromJson(doc.toJson(relaxed), CustomeObject.class);

Document.toJson() 给出 bson 而不是 json.

即对于 Long 字段 myLong 等于 Documentxxx 它产生 json 如:

 "myLong" : { "$numberLong" : "xxx"}

使用 Gson 进行解析显然不会给出 myLong=xxx

要使用 GsonDocument 转换为 Pojo,您可以执行以下操作:

Gson gson = new Gson();
MyPojo pojo = gson.fromJson(gson.toJson(document), MyPojo.class);