2015-09-28 38 views
0

我一直在研究一个Java程序,它利用Mongo数据库来存储有关基于地理坐标的飞机的某些数据。应用程序正在努力达到收集信息并以正确方式填充模型对象的地步。Mongo无法将HashMap投射到BasicDBObject

当我尝试发送对象向蒙戈数据库,会出现以下错误:java.lang.ClassCastException: java.util.hashmap cannot be cast to com.mongodb.basicDbObject.与此异常的问题:我没有一个HashMap(或通常任何类型的地图)

要添加对象到我使用下面的代码数据库:

DBCollection table = db.getCollection(GRID_NAME); 
GridCell c = cell.getCell(true); 
String jString = (String) mapper.writeValueAsString(c); //mapper is a Jackson ObjectMapper 
System.out.println(jString); 
table.insert((BasicDBObject) JSON.parse(jString)); 

在这里的网格单元包含两个浮标和平面对象的名单。平面对象包含一个字符串和另外10个双精度值。除此之外,这些类只对所有变量拥有基本的getter和setter。

栅格单元

private float lat; 
private float lng; 
private List<Plane> planeList; 

平面

private String identiefier; 
private double minHeight; 
private double maxHeight; 
private double avgHeight; 
private double minSpeed; 
private double maxSpeed; 
private double avgSpeed; 
private double minCourse; 
private double maxCourse; 
private double avgCourse; 

的吸气和setter(都看或多或少相同这两个)

public float getLng() { 
    return lng; 
} 

public void setLng(float lng) { 
    this.lng = lng; 
} 

正如你在上面看到的,我将json字符串打印到控制台以检查它是否正确。我不得不承认,我的普通json阅读技能充其量是狡猾的。但我在这找不到hashmap:

{"lat":28.0,"lng":5.0,"planeList":[{"identifier":"myTestPlane","minHeight":1.0,"maxHeigh":2.0,"avgHeight":1.5,"minSpeed":1.0,"maxSpeed":2.0,"avgSpeed":1.5,"minCourse":1.0,"maxCourse":2.0,"avgCourse":1.5}]} 

任何想法或建议我做错了什么?我可能有一个周一早上的时刻,但我真的无法弄清楚。

+0

'JSON.parse'很可能产生一个HashMap。你在那里使用什么图书馆? – Thilo

+0

@Thilo org.mortbay.util.ajax.JSON –

+0

这对MongoDB无所知。我认为还有'com.mongodb.util.JSON'。试试那个。 http://stackoverflow.com/a/12261133/14955 – Thilo

回答

3

您正在使用“错误的”JSON库。

如果你想要MongoDB的DBObject,你可以使用com.mongodb.util.JSON

import com.mongodb.util.JSON; 

DBObject bson = (DBObject) JSON.parse(json); 

如果你有从其他地方现有的地图,你也可以尝试先从new BasicDBObject()putAll数据到它。

+0

所有测试都是绿色的,我会在几分钟内接受答案(堆栈溢出有一个计时器)。谢谢! –

0

只是预告,DBOBJECT不建议使用文件鼓励:http://mongodb.github.io/mongo-java-driver/3.1/bson/documents/

+0

谢谢你的建议Vambo。然而,我选择在文档上使用DBObjects的原因如下:DBObjects的限制不会影响我的应用程序(Map 的缺失选项有点烦人但可管理)。其次,整个应用程序作为服务展开。对象已经在json中传入了它们之间。上面的代码是一个简化的例子,通常对象会以json的形式到达服务中,而不是将其序列化到一个对象,然后创建一个文档,而不是将其转换为DBObject并将其发送。 –

+0

我想你可以使用'Document.parse()'完成相同的操作,不需要任何中间转换。 – vambo

+0

我不知道那里有。我会试一试,谢谢! –