ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject 的解决办法

com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONObject报错处理 阅读详情
AI摘要

本文详细解析了在调用远程服务接口时遇到的“java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject”错误,并提供了使用FastJson、Jackson、Gson等工具的解决方案,以及如何通过Apache commons-lang或commons-text的StringEscapeUtils工具优化性能。

问题概述

关于这个问题,是与第三方公司合作,远程调用服务接口时(就相当于调用远程服务提供者)遇到的这个问题,“ java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject ” 表示不能将JSON字符串转换为JSONObject对象。

部分异常截图如下:

 

具体信息如下:

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:229)
	... 56 more

 

解决办法

当调用接口接收到信息后,使用的是alibaba的FastJson工具类来进行反序列化的,示例代码如下:

    @Test
    public void fastjson() {
        // 将员工对象序列化为Json字符串
        String jsonString = JSON.toJSONString(initEmployee());
        System.out.println(jsonString);
        // 将Json字符串反序列化为Java对象
        Employee employee = JSON.parseObject(jsonString, Employee.class);
        System.out.println("empName: " + employee.getName());
    }

 

或者Jackson(相对于FastJson,FastJson在支持泛型方面更好些),示例代码如下:

    @Test
    public void jackson() throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        // 将Java对象序列化为Json字符串
        String asString = objectMapper.writeValueAsString(initEmployee());
        System.out.println(asString);
        // 将Json字符串反序列化为Java对象
        Employee employee = objectMapper.readValue(asString, Employee.class);
        System.out.println("empName: " + employee.getName());
    }

 

当然你也可以使用Google的Gson,示例代码如下:

    @Test
    public void gson() {
        Gson gson = new GsonBuilder().create();
        // 将Java对象序列化为Json字符串
        String json = gson.toJson(initEmployee());
        System.out.println(json);
        // 将Json字符串反序列化为Java对象
        Employee employee = gson.fromJson(json, Employee.class);
        System.out.println("empName: " + employee.getName());
    }

问题排查:

查看调用返回的结果,发现了惊奇的一幕,在返回的调用结果里面出现了很多的转义字符,不是一个正确的JSON字符串,当然不能序列化成功了,示例内容如下:

"{\"id\":\"1001\",\"name\":\"张三\",\"password\":\"zhangsan\"}"

(当然以上只是为了证明问题的测试数据,实际数据接口数据要比这个复杂的多,而且进行了特殊的加密算法,但返回的数据格式与上相同,且最终的解决办法相同)

 

解决办法:

1、通过手动剔除转义字符的方式,示例代码如下:

    @Test
    public void tData() {
        String data01 = "{\"id\":\"1001\",\"name\":\"张三\",\"password\":\"zhangsan\"}";
        System.out.println("data01:" + data01);
        // 序列化为JSON字符串
        String data02 = JSON.toJSONString(data01);
        System.out.println("data02:" + data02);
        //通过 replace 去掉斜杠
        String data03 = data02.replace("\\", "");
        System.out.println("data03:" + data03);
        //去掉首尾的引号
        String data04 = data03.substring(1, data03.length() - 1);
        System.out.println("data04:" + data04);
        Map map = JSON.parseObject(data04, Map.class);
        System.out.println(map.get("name"));
    }

得到了想要的结果如下:

但是上面这个有个问题,每一次的转换都会去遍历所有的内容,当内容长度小时无所谓,但是当长度较长时,问题就来了,会消耗大量的时间,例如,博主本人的数据量较大,没调用一次接口都会花费一到两分钟来处理结果,这个。。。

 

性能优化:通过Apache的commons-lang工具包中有很多字符串处理的工具类,StringEscapeUtils就是其中之一,不过需要注意的是StringEscapeUtils是2.3版本以上才加上的,不过博主在官网看到3.0以后又开始弃用了并将该功能搬移到了commons-text工具包中,所以需要注意导入对应的包才行呀!!!

如果使用commons-lang则添加依赖:


        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

如果使用commons-text则添加依赖:

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-text</artifactId>
			<version>1.6</version>
		</dependency>

使用StringEscapeUtils工具类进行反序列化转义字符,示例内容如下:

   @Test
    public void tData() {
        String data01 = "{\"id\":\"1001\",\"name\":\"张三\",\"password\":\"zhangsan\"}";
        System.out.println("data01:" + data01);
        // 序列化为JSON字符串
        String data02 = JSON.toJSONString(data01);
        System.out.println("data02:" + data02);
        // 通过StringEscapeUtils工具类反序列化转义字符
        String data04 = StringEscapeUtils.unescapeJava(data01);
        System.out.println("data04:" + data04);
        Map map = JSON.parseObject(data04, Map.class);
        System.out.println(map.get("name"));
    }

使用起来,结果一样,但是在处理大的较长的字符串内容时,使用StringEscapeUtils的效果会更佳的显著咯!!!

当然StringEscapeUtils还有很多好玩而且非常使用的方法,这个就需要自己去玩了,如下图:

 

 

 

 


 好了,关于 ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject 的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:优快云 (Chinese Software Developer Network)
原        文:https://blog.youkuaiyun.com/Hello_World_QWP/article/details/90692167
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
【Java】“com.alibaba.fastjson.JSONObject cannot be cast to“报错问题 通过 debug 断点可以看到,这里拿到虽然是 List,但是里面的对象还是一个 JSONObject,并不是我们需要的 DTO 类,所有导致了后面的报错。查到问题根源,只要把这里的对象转化为我们的 DTO 类就行了,就可以避免报错。 阅读详情

相关推荐

Redis+fastjson 类型转换异常排查与根治方案

在 Java 后端开发中,将对象序列化存入 Redis、取回后反序列化还原,是缓存场景的常见操作。然而 JSON 本身不携带完整的 Java 类型信息,一旦反序列化时的目标类型不够精确,就很容易触发 ClassCastException:集合泛型被擦除导致 LinkedHashMap 无法强转为业务对象,或者 Long 变成 Integer 引发标量类型漂移。这些问题的根源在于泛型擦除与 JSON 类型推断规则的叠加效应。通过 TypeReference、强类型 DTO、以及安全的数值取值 API,可以有效

weixin_34226706的博客 265

java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject解决办法

java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject ” 表示不能将JSON字符串转换为JSONObject对象,出现错误的原因是因为字符串不是一个标准的json格式,可以打印到控制台看下字符格式,如果不能找到错误原因,可以用Postman 或者浏览器 json格式化一下。

m0_67393686的博客 1万+

fastjson2自定义ObjectReader解析异构List:原理、实战与避坑指南

JSON反序列化是数据处理中的基础环节,其核心是将JSON字符串转换为编程语言中的对象。标准解析器在处理结构规整的数据时表现良好,但当面对元素类型不固定的异构数组时,通用策略往往失效,导致业务代码充斥类型判断,丧失类型安全与可维护性。fastjson2作为高性能JSON库,其ObjectReader接口提供了深度定制反序列化过程的能力,通过动态类型识别与绑定,能从根本上解决异构集合的解析难题。这一技术在处理历史遗留数据格式、设计灵活API接口等场景中极具价值。本文将以fastjson2自定义ObjectRe

weixin_30263277的博客 358

java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject

JSON.toJavaObject(JSON.parseObject(value), class) 改成 JSON.parseObject(value, class)

xdhc的博客 1万+

Java实体与Map转换全解析:从反射、序列化库到性能优化实践

在Java开发中,对象与字典结构的相互转换是数据处理的基础操作,涉及序列化、ORM映射和动态配置等核心场景。其原理在于桥接强类型的对象世界与弱类型的字典世界,需要在类型安全、性能与灵活性之间取得平衡。这项技术的价值在于提升代码的通用性和动态处理能力,是构建灵活数据管道的关键。实践中,开发者常面临反射性能陷阱、类型转换异常等挑战。通过对比手动编码、反射工具、Jackson/Gson等序列化库以及Spring/Hutool框架方案的优劣,可以针对不同场景选择最优解。例如,在需要处理JSON交互和高性能序列化的微

weixin_33965305的博客 513

Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long错误的详细解决方法

Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long错误的详细解决方法

念兮为美 9084

JSONArray中获取JSONObject报错 java.lang.ClassCastException: java.lang.String cannot be cast to com.alibab

JSONArray中获取JSONObject报错 java.lang.ClassCastException: java.lang.String cannot be cast to com.alibab

qq_24981615的博客 5782

TCP协议中ARQ自动重传的三种实现方式对比(含SACK详解)

本文深入解析TCP协议中ARQ自动重传的三种实现方式,包括停止-等待、回退N步和选择重传协议,特别详细介绍了SACK机制的工作原理和优势。通过对比分析各协议的效率、复杂度和适用场景,为网络通信中的可靠性传输提供了实用的选型指南。

weixin_30776273的博客 460

java object强转报错_java.lang.ClassCastException/ java.lang.String cannot be cast to com.alibaba.fastjso...

Java中转JSONObject报错java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject意思是不能将字符串转为JSONObject,有两个类,一个父类BaseLivenessResult有一个属性为JSONObject类型的jsonResult,一个子类Bas...

weixin_34274163的博客 1617

ILI9488 TFT屏驱动与触摸协同开发指南

TFT-LCD显示模块是嵌入式人机交互系统的核心外设,其工作原理依赖于专用显示控制器(如ILI9488)对GRAM显存的精确读写,并通过SPI等串行总线接收指令与图像数据。理解RGB接口时序、寄存器初始化流程及DC/CS信号控制逻辑,是实现稳定显示的基础技术前提;而四线电阻式触摸功能则需配合XPT2046类ADC控制器,通过独立SPI或模拟时序完成坐标采集。该方案兼顾低功耗、高集成与工程可移植性,广泛应用于工业HMI、仪器仪表及STM32F407等MCU平台的教学与产品开发。本文围绕3.5英寸320×480

weixin_33814090的博客 148

STM32G0实战:手把手教你用国产GD25Q16 Flash存储传感器数据(附完整驱动)

本文详细介绍了如何使用国产GD25Q16 Flash芯片与STM32G0系列MCU实现传感器数据存储的完整方案。从SPI接口配置、驱动层实现到存储系统架构设计,提供了实战代码和优化策略,帮助开发者快速构建高性价比的物联网数据存储系统。

weixin_30733003的博客 104

java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject

java.lang.ClassCastException: java.lang.String cannot be cast to com.alibaba.fastjson.JSONObject         at com.alibaba.fastjson.JSONObject.getJSONObject(JSONObject.java:109) 该异常的原因,是因为你所解析的JSON不是

angelofmersy的专栏 5万+

ERA5获取的风场数据转换为.dfs2文件

ERA5获取风场数据的具体步骤可以参考下面的文章下载好后应该是.nc格式的文件,想要读取或者转换成其他格式的文件可以安装下面步骤,本文介绍如何转换为.dfs2文件。

我的博客 1458

Fastjson与Redis序列化:泛型擦除和AutoType导致的ClassCastException排查指南

Java 序列化是分布式缓存场景中的基础技术,它决定了对象如何在网络和存储间传递。在 Redis 这类纯字符串存储中,序列化方案的选型直接关系到数据能否被正确还原。Fastjson 凭借简洁 API 和高性能被广泛使用,但对泛型擦除和自动类型机制的忽视,常引发 ClassCastException 或 AutoType 校验失败。泛型信息在编译后会被 JVM 擦除,反序列化时若未显式指定类型,集合元素可能被还原为 JSONObject;而 AutoType 写入的 @type 字段又会带来跨版本、跨系统的类

weixin_34221036的博客 287

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.csdn.net/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2845

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

XiaoqiangClub的博客 1021

关于fastjosn转化HashMap存储Redis引发的java.lang.ClassCastException: java.lang.Integer cannot be cast to java

在工作中因为某PHP开发想偷懒,不想要如下这样的HashMap序列化后的数据,偏偏要第二张这样的存储数据 如第二张图所示想要这样的存储数据。面对这样的需求,只能一步步开始搞 第一步先解决redis存HhashMap不以序列化的方式存储: 在RedisUtil中加入 @Autowired(required = false) public void setRedisTemplate(RedisTemplate redisTemplate) { RedisSerializer str

qq_39156914的博客 1150

解锁RK3588多屏异显:MIPI+HDMI+EDP混合输出全攻略

本文详细介绍了RK3588处理器在MIPI+HDMI+EDP混合输出配置中的技术实现与应用。作为一款高性能处理器,RK3588凭借其强大的图形处理能力,支持多屏异显功能,可满足智能安防、工业控制等领域的多屏显示需求。文章从硬件连接、设备树配置、内核驱动设置到显示参数调整,系统阐述了配置流程,并针对信号不稳定、显示模式不匹配等常见问题提供了解决方案。通过智能安防监控案例,展示了该技术在提高监控效率方面的实际应用价值。随着技术进步,RK3588多屏异显技术将在更多领域发挥重要作用,为开发者提供灵活多样的显示方案

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2431

第4章:JVM类加载机制——双亲委派与 ClassLoader 体系

支付系统引入风控SDK后出现"ClassCastException: JSONObject无法转换为JSONObject"异常,揭示了类加载机制的一个关键盲区——同一类被不同ClassLoader加载后会被JVM视为完全不同的类型。本文从类加载的生命周期(加载-链接-初始化)出发,解析双亲委派模型的原理与典型破坏场景(如SPI、Tomcat隔离),并通过实战演示如何制造和解决类冲突。核心发现:类的身份由类名+ClassLoader共同决定,这种机制既是Java安全性的基石,也是类隔离型框架的设计基础。

davidwang456的专栏 402

如何让C++程序生成dump文件?生成dump文件的方式有哪些?如何使用Windbg分析dump文件?

本文详细介绍了如何让C++程序生成dump文件、生成dump文件的多种方式以及如何使用Windbg分析dump文件,并给出了对应的实战分析案例,有一定的实战参考价值。

dvlinker的技术专栏 5万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database '/b2c_aiyou' 的解决办法
下一篇: Error contacting service. It is probably not running. 的解决办法
TechBro华仔
TechBro华仔 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄11年 5万+粉丝 430原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechBro华仔

日拱一卒无有尽,功不唐捐终入海

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值