当前位置: 首页 > news >正文

spring boot的返回值里面含有net.sf.json.JSONObject 报错net.sf.json.JSONNull[“empty“])]

一、过程

在对接第三的接口使,发现对方使用的json是net.sf.json.JSONObject。接口在返回值的时候就没有对其进行处理,直接返回了但是,后台也不报错,后端也没有收到响应值,只显示500的报错状态码。仔仔细细的看后台的日志发现:

2024-03-28 10:57:14.514  WARN 34128 --- [nio-8022-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver :Resolved [org.springframework.http.converter.HttpMessageNotWritableException: 
Could not write JSON: Object is null; nested exception is 
com.fasterxml.jackson.databind.JsonMappingException:Object is null (through reference chain: com.at21.sign2.util.ResultUtils["data"]-
>net.sf.json.JSONObject["dd"]->net.sf.json.JSONArray[1]->net.sf.json.JSONNull["empty"])]

这尼玛,报错就好好报错,你打个warn 是什么鬼,就不会error么!!!屮

二、复现bug

接口的部分代码

    @RequestMapping("test")public Object test() {JSONArray ja = new JSONArray();ja.add("aaa");ja.add(null);JSONObject js = new JSONObject();js.put("aa", 141);js.put("bb", null);js.put("cc", "");js.put("dd", ja);System.out.println(js.toString());return ResultUtils.success(js);}

打印的json数据是:  {"aa":141,"cc":"","dd":["aaa",null]}
问题1:bb是null,你™的吃了啊!!

问题2:数组里面有null spring boot响应就直接500了

三、解决

方法1:遍历去除数组中的null

JSONObject json2 = new JSONObject();
JSONObject xxxxxx = (JSONObject) json.get("xxxxxx");
Iterator<Map.Entry<String, Object>> it = xxxxxx.entrySet().iterator();
while (it.hasNext()){Map.Entry<String, Object> next = it.next();if(!(next.getValue() instanceof JSONNull)) {json2.put(next.getKey(),next.getValue());}
}
json.put("xxxxxx", json2);

方法2:配置spring boot 的json格式的序列化

@Bean
public ObjectMapper objectMapper(){return new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

方法3:不要使用 net.sf.json.JSONObject (垃圾)

建议使用阿里的 com.alibaba.fastjson.JSONObject

        <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>

相关文章:

  • <深度学习入门学习笔记P1>——《深度学习》
  • 后端返回文件流pdf 下载
  • 【AIGC调研系列】Starling-LM-7B模型与其他模型相比的优势和劣势
  • 更高效稳定 | 基于ACM32 MCU的编程直流电源应用方案
  • C#WPF控件TextBlock详解
  • 通俗易懂:如何通过JVM参数来调整内存大小?
  • OpenFeign原理整理【Java面试】
  • Gitlab CI---could not read username for xxx: no such device or address
  • flutter 打包成web应用后怎么通过url跳转页面
  • Chrome 插件 tabs API 解析
  • uniApp使用XR-Frame创建3D场景(8)粒子系统
  • 目标检测+车道线识别+追踪
  • pulsar: kafka on pulsar之把pulsar当kafka用
  • 【直播课】2024年PostgreSQL CM认证实战培训课程于4月27日开课!
  • 持续集成流水线介绍(CI)
  • CSS魔法堂:Absolute Positioning就这个样
  • ESLint简单操作
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript-Array类型
  • LintCode 31. partitionArray 数组划分
  • Mac转Windows的拯救指南
  • QQ浏览器x5内核的兼容性问题
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring Cloud Feign的两种使用姿势
  • use Google search engine
  • WePY 在小程序性能调优上做出的探究
  • 订阅Forge Viewer所有的事件
  • 今年的LC3大会没了?
  • 力扣(LeetCode)357
  • 前端相关框架总和
  • 走向全栈之MongoDB的使用
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 容器镜像
  • 数据库巡检项
  • #etcd#安装时出错
  • #在 README.md 中生成项目目录结构
  • (12)Linux 常见的三种进程状态
  • (175)FPGA门控时钟技术
  • (4)Elastix图像配准:3D图像
  • (42)STM32——LCD显示屏实验笔记
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Python第六天)文件处理
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)mysql_MYSQL(三)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五)IO流之ByteArrayInput/OutputStream
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)大型网站架构演变和知识体系
  • .bat批处理出现中文乱码的情况
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008