標籤:strong instance cep ram div blog 工具類 方法 需要
以及:java.lang.ClassCastException: org.json.JSONObject$Null cannot be cast to java.lang.Long
參考 :http://blog.csdn.net/u010823097/article/details/51780932
問題:
使用 Java MongoDB Driver < version: 3.2.2 > 的過程中,Updates 方法(MongoDB API Docs)會出現一個棘手的問題。
比如 set("data", userData) , 當 userData 類型為 Java 中的集合時(例如 JSONArray),程式會拋出 org.bson.codecs.configuration.CodecConfigurationException: Can‘t find a codec for class JSONArray. 異常。
解決方案:
這是由於,MongoDriver所有操作的基礎資料型別 (Elementary Data Type)都為Bson, 而其沒有內嵌 將 JSONArray 轉換為 BsonArray 的方法,這就需要我們自己動手做類型轉換。
1 問題:2 3 使用 Java MongoDB Driver < version: 3.2.2 > 的過程中,Updates 方法(MongoDB API Docs)會出現一個棘手的問題。4 比如 set("data", userData) , 當 userData 類型為 Java 中的集合時(例如 JSONArray),程式會拋出 org.bson.codecs.configuration.CodecConfigurationException: Can‘t find a codec for class JSONArray. 異常。5 6 7 解決方案:8 9 這是由於,MongoDriver所有操作的基礎資料型別 (Elementary Data Type)都為Bson, 而其沒有內嵌 將 JSONArray 轉換為 BsonArray 的方法,這就需要我們自己動手做類型轉換。
BsonArray 的子資料類型為 BsonValue,我們需要將 JSONArray中的 Java基礎類型 轉換為 BsonValue 類型,所以我自訂了一個 BsonTool.objectToBsonValue() 方法:
1 JSONArray userData = JSONArray.parseArray(userDataObj); 2 BsonArray bsonArray = new BsonArray(); 3 JSONObject jo; 4 for (int i = 0; i < userData.size(); i++) { 5 jo = userData.getJSONObject(i); 6 BsonDocument document = new BsonDocument(); 7 if (!jo.isEmpty()) { 8 Set<String> set = jo.keySet(); 9 for (String key : set) {10 document.put(key, BsonTool.objectToBsonValue(jo.get(key)));11 }12 }13 bsonArray.add(document);14 }
BsonArray 的子資料類型為 BsonValue,我們需要將 JSONArray中的 Java基礎類型 轉換為 BsonValue 類型,所以我自訂了一個 BsonTool.objectToBsonValue() 方法:
1 public class BsonTool { 2 3 /** 4 * Java對象轉BsonValue對象 5 * @param obj 6 * @return 7 */ 8 public static BsonValue objectToBsonValue(Object obj){ 9 if (obj instanceof Integer){10 return new BsonInt32((Integer) obj);11 }12 13 if (obj instanceof String){14 return new BsonString((String) obj);15 }16 17 if (obj instanceof Long){18 return new BsonInt64((Long) obj);19 }20 21 if (obj instanceof Date){22 return new BsonDateTime(((Date) obj).getTime());23 }24 return new BsonNull();25 }26 27 }
這個工具類中,沒有把類型覆蓋全,只覆蓋了我需要的一些類型,可按需添加。
最後只需將 set("data", userData) =>> set("data", bsonArray),搞定,錯誤解決。
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.json.JSONObject$Null.