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),搞定,错误解决。

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

时间: 2024-07-28 13:10:24

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class org.json.JSONObject$Null.的相关文章

PICE(5):MongoDBStreaming - gRPC -MGO Service

我在前面提到过MongoDB不支持像SQL般字符式的操作指令,所以我们必须对所有的MongoDB操作指令建立protobuf类型才能支持MongoDB指令的序列化.在对上一篇博文里我们把MongoDB的消息指令序列化单独挑出来讨论了一番,在这篇我们准备在一个MongoDB scala开发环境里通过streaming运算来示范这些protobuf消息的应用. 与前面我们介绍过的JDBC-streaming和Cassandra-streaming对应操作指令的处理相同,MGO-streaming也是

mongodb ----&gt; 从入门到。。。

环境: centos6.8,jdk1.8.0_u172,mongodb-4.0.0,spring boot-1.5.15 1.环境搭建 1 tar -zxvf mongodb-linux-x86_64-rhel62-4.0.0.tgz -C /home/rui/ #解压,指定放置位置 2 3 mv mongodb-linux-x86_64-rhel62-4.0.0 mongodb-4.0.0 #重命名 4 5 cd mongodb-4.0.0 6 7 vim mongodb.conf #配置数据

Akka-Cluster(3)- ClusterClient, 集群客户端

上篇我们介绍了distributed pub/sub消息传递机制.这是在同一个集群内的消息共享机制:发布者(publisher)和订阅者(subscriber)都在同一个集群的节点上,所有节点上的DistributedPubSubMediator通过集群内部的沟通机制在底层构建了消息流通渠道.在actor pub/sub层面可以实现对象位置透明化.在现实里很多前端都会作为某个集群的客户端但又与集群分离,又或者两个独立的集群之间可能会发生交互关系,这是也会出现客户端与服务端不在同一集群内的情况,C

Selenium Grid Configuration

作者: Max.Bai 时间: 2014/06 1. Start Selenium Hub java -jar selenium-server-standalone-2.<last_version>.jar-role hub Can be check the hub status use http://127.0.0.1:4444/grid/console 2. Start Selenium Node Start with Node contains Selenium RC and Webdr

ASP.NET 5: New configuration files and containers

原文:http://gunnarpeipman.com/2014/11/asp-net-5-new-configuration-files-and-containers/ ASP.NET vNext提供了一种新的config文件. 能支持多种格式的config文件可以是.json .ini .xml. 另外你还可以写configuration handler用来处理你自定义格式的config文件. Configuration文件 假设我们有3个config文件 config.json { "Co

asp.net core 系列 11 配置configuration (下)

四. 文件配置提供程序AddIniFile. AddXmlFile.AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类. 以下配置提供程序专用于特定文件类型: (1) INI 配置提供程序 IniConfigurationProvider: FileConfigurationProvider (2) JSON 配置提供程序 JsonConfigurationProvider: FileConfigurationProvider (3) XML

android多媒体框架学习 详解 最新版本

一:多媒体框架概述   jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现了media 在整个android系统中的重要性!framework/av下都是些C/C++代码(libmedia,libmediaplayerservice,libstagefright),jni和 java api 还是保留在原来的位置,改革还不够彻底,但还是迈出了这一步,以后维护能更好的进

Android4.2.2下Stagefright多媒体架构中的A31的OMX插件和Codec组件

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email: [email protected] 在前面的博文中提到,AwesomePlayer::onPrepareAsyncEvent()开始进行Codec解码器组件的获取以及创建,这里和大家分享. 1.以解码器实例作为切入点 status_t AwesomePlayer::initVideoDecoder(uint32_t flags) { ATRACE_CALL(); ...... ALOG

PJSUA2开发文档--第四章 端点ENDPOINT

4.端点ENDPOINT Endpoint类是一个单例类,应用程序必须在此类实例之前创建一个并且最多只能创建一个,然后才能执行任何操作.同样,一旦这个类被销毁,应用程序就不能调用该库的任何API.这个类是PJSUA2的核心类,它提供了以下功能: 启动和关机 配置的定制,如核心UA(用户代理)SIP配置,媒体配置和日志配置 本章将介绍上述功能. 要使用Endpoint类,通常应用程序不需要进行子类化(再写继承于该类的子类,简称子类化(subclass)),除非: 应用程序希望实现/重载端点回调方法