首页 > 代码库 > org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.json.JSONObject$Null.

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 =http://www.mamicode.com/ 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.