首页 > 代码库 > 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.