开发避坑短篇(一):JSONNull转型String异常分析

异常信息

java.lang.ClassCastException: net.sf.json.JSONNull cannot be cast to java.lang.String

业务背景

使用net.sf.json类库解析第三方接口返回的json格式的数据的时候报错,接口返回数据jsonStr的值如下:

{"msg":"操作成功","code":200,"data":{"bizCode":"00","bizMsg":"下单成功!","serialId":"2ae24bb1-9bb2-722b-8698-ade57f143938","detail":null}}

相关代码

...
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
int code = (int) jsonObject.get("code");
String msg = (String) jsonObject.get("msg");
String retJson = "";
if (200 == code) {
    JSONObject bodyData = jsonObject.getJSONObject("data");
    String bizCode = (String) bodyData.get("bizCode");
    String bizMsg = (String) bodyData.get("bizMsg");
    if ("00".equals(bizCode)) {
        String detail = (String) bodyData.get("detail");
...      
    }
}
...

异常分析

报错代码

String detail = (String) bodyData.get("detail");

在这里插入图片描述

从异常信息看,bodyData.get(“detail”)拿到的是一个JSONNull,不能强转为字符串类型,所以报错了。那为什么拿到不是null或者"null"?调试的时候看到的data的值是“null”?拿bodyData.get(“detail”)做null判断或者与"null"比较看得不得。

Object obj = bodyData.get("detail");
System.out.println(null == obj || "null".equals(obj));

输出结果是false,所以bodyData.get(“detail”)拿到的值不是null对象也不是"null"字符串,而是一个JSONNull类型的变量。JSONNull是org.json库中的一个特殊类,用于表示JSON中的null值。如果你尝试直接获取一个不存在的键的值,或者在解析的JSON中某个值确实是null,你可能会得到一个JSONNull实例。

解决办法

要避免尝试获取JSONNull的值引发的异常,可以做类型判断。

Object obj = bodyData.get("detail");
if(!(obj instanceof net.sf.json.JSONNull)) {
	String detail = (String) bodyData.get("detail");
...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

帧栈

您的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值