我有一段代码可以从MongoDB中以特定格式读取数据,需要进行测试。
为了进行测试,我创建了一个JSON文件,用于测试数据。
这是应该被创建的对象:
我有一段代码,它可以读取一个JSON文件并创建一个Mongo文档,并将其写入数据库:
一旦数据被写入,就有一段代码尝试从MongoDB中读取数据并将其填充到一个
这句话的意思是“出现错误信息导致失败”。
由于这行代码
我尝试了以下代码,并且它可以工作:
但是这是最好的解决方案吗?
更新:
@glytching 给出了一个很好的答案!
我还发现另一种方法,显然如果你将 JSON 的数字元素包装在
所以使用旧代码,我可以通过更改我的 JSON 来使它工作:
为了进行测试,我创建了一个JSON文件,用于测试数据。
{
"id": ObjectId("57552e32e4b0839ede67e0af"),
"serial" : 574000690,
"startDate" : ISODate("2016-08-22T23:01:56.000Z"),
"endDate" : ISODate("2016-10-22T22:01:56.000Z"),
"reason": ""
}
这是应该被创建的对象:
public static class MyObject implements Serializable{
private String id;
private long serial;
private Date startDate;
private Date endDate;
private String reason;
}
我有一段代码,它可以读取一个JSON文件并创建一个Mongo文档,并将其写入数据库:
List<Document> docs = dirAsDbObjects(dir + File.separator +
subDir.getName()).collect(Collectors.toList());
docs.forEach(docManipulator);
docs.forEach(doc -> doc.putIfAbsent("_id", new ObjectId()));
ret.addAll(docs);
MongoDatabase db = mongoClient.getDatabase(dbName);
MongoCollection<Document> coll = db.getCollection(subDir.getName());
List<InsertOneModel<Document>> inserts = docs.stream().map(InsertOneModel::new).collect(Collectors.toList());
coll.bulkWrite(inserts);
一旦数据被写入,就有一段代码尝试从MongoDB中读取数据并将其填充到一个
MyObject
实例中: public MyObject(Document doc) {
id = doc.getObjectId(DBConstants.ID).toString();
serial = doc.getLong(DBConstants.SERIAL);
startDate = doc.getDate("startDate");
reason = doc.getString("source");
}
这句话的意思是“出现错误信息导致失败”。
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
由于这行代码
serial = doc.getLong(DBConstants.SERIAL);
,它基本上从我的JSON中获取数字作为“Integer”,因此无法将其读取为长整型。我尝试了以下代码,并且它可以工作:
Long.parseLong(doc.get(DBConstants.SERIAL).toString())
但是这是最好的解决方案吗?
.toString()
总是会得到一个数字的字符串表示吗?有没有一种方法可以在 JSON 中保留一个数字,使其被读取为 Long
?更新:
@glytching 给出了一个很好的答案!
我还发现另一种方法,显然如果你将 JSON 的数字元素包装在
NumberLong
中,当从 Mongo 文档翻译时它将被解析为 Long
。所以使用旧代码,我可以通过更改我的 JSON 来使它工作:
{
"id": ObjectId("57552e32e4b0839ede67e0af"),
"serial" : NumberLong(574000690),
"startDate" : ISODate("2016-08-22T23:01:56.000Z"),
"endDate" : ISODate("2016-10-22T22:01:56.000Z"),
"reason": ""
}