org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.json.JSONObject$Null.


以及: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所有操作的基本數據類型都為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所有操作的基本數據類型都為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),搞定,錯誤解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM