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

來源:互聯網
上載者:User

標籤: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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.