2015-09-28 72 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

我不知道那裏有。我會試一試,謝謝! –