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

解决fastJson JSON.parseArray方法 非法字符问题

解决fastJson JSON.parseArray方法 非法字符问题

  • 1. 问题描述
  • 2. 解决办法
  • 3. 📌 各字符说明:

1. 问题描述

数据库中某个字段存储的数据是JSON类型,取出数据时需要JSON.parseArray 但是爆出如下错误

2025-04-17 16:20:55.650 [http-nio-0.0.0.0-8080-exec-1] ERROR c.a.i.k.g.c.a.t.CronUpdateTaskController - [result]图谱结果,失败,offset 3, character  , line 2, column 2, fastjson-version 2.0.52
[{"relationType": "搭档","num": 15},{"relationType": "好友","num": 12},{"relationType": "前女友","num": 2},{"relationType": "同学","num": 1},{"relationType": "女儿","num": 1},{"relationType": "妻子","num": 1}
]
2025-04-17 16:20:55.660 [http-nio-0.0.0.0-8080-exec-1] ERROR c.a.i.k.g.f.w.h.GlobalExceptionHandler - [defaultExceptionHandler]
com.alibaba.fastjson2.JSONException: offset 3, character  , line 2, column 2, fastjson-version 2.0.52
[{"relationType": "搭档","num": 15},{"relationType": "好友","num": 12},{"relationType": "前女友","num": 2},{"relationType": "同学","num": 1},{"relationType": "女儿","num": 1},{"relationType": "妻子","num": 1}
]at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:302)at com.alibaba.fastjson2.JSONReader.read(JSONReader.java:1860)at com.alibaba.fastjson2.JSON.parseArray(JSON.java:2473)at cn.ac.ict.knowledge.graph.service.task.UpdateTaskServiceImpl.buildRelation(UpdateTaskServiceImpl.java:919)at cn.ac.ict.knowledge.graph.service.task.UpdateTaskServiceImpl.result(UpdateTaskServiceImpl.java:902)at cn.ac.ict.knowledge.graph.controller.app.task.CronUpdateTaskController.result(CronUpdateTaskController.java:176)at cn.ac.ict.knowledge.graph.controller.app.task.CronUpdateTaskController$$FastClassBySpringCGLIB$$6687128f.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:64)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:57)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)at cn.ac.ict.knowledge.graph.controller.app.task.CronUpdateTaskController$$EnhancerBySpringCGLIB$$649ef656.result(<generated>)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)at javax.servlet.http.HttpServlet.service(HttpServlet.java:555)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:623)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at cn.dev33.satoken.filter.SaPathCheckFilterForServlet.doFilter(SaPathCheckFilterForServlet.java:55)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)

有用的信息

com.alibaba.fastjson2.JSONException: offset 3, character  , line 2, column 2, fastjson-version 2.0.52

看起来是字符非法的问题,因为JSON本身没问题。

2. 解决办法

经过了解很可能是这个 JSON 字符串中混入了 不可见的非法字符(比如全角空格、BOM头、Unicode空白符等),尤其是[ 后面那一行里的空格,是个 非 ASCII 空格(全角空格 U+3000 或 Unicode 空格),fastjson2 解析的时候直接报错。

我直接通过工具类来清洗数据

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version>
</dependency>
import org.apache.commons.lang3.StringUtils;JSON.parseArray(StringUtils.trim(ABC.getTagInfo())
.replaceAll("[\\uFEFF\\u200B\\u00A0\\u3000\\u202F\\u2007]", ""));

问题完美解决!

3. 📌 各字符说明:

在这里插入图片描述

相关文章:

  • e实例性能测评:Intel Xeon Platinum处理器,经济型入门级服务器
  • 基于爱—特的未来的时空奇点压缩爆炸
  • 【限流算法】计数器、漏桶、令牌桶算法
  • 高精度--
  • ArcPy工具箱制作(上)
  • Vue王炸打包工具新作品 Tsdown上线
  • Java Collection(8)——Map的遍历方式
  • LLM做逻辑推理题 - 拥有古物的是谁?
  • C语言数据结构---二叉树---堆的应用
  • FreeRTOS事件标志组
  • LeetCode算法题(Go语言实现)_52
  • OpenCV 图形API(42)颜色空间转换-----将 BGR图像转换为 I420(YUV 4:2:0)格式函数BGR2I420()
  • 考研数据结构之图的应用:最小生成树、最短路径、拓扑排序与关键路径
  • 邮件自动回复助手(Rasa/SMTP)实现教程
  • 【HDFS入门】HDFS核心配置与优化指南概述
  • 【Pytorch之一】--torch.stack()方法详解
  • C#学习第15天:泛型
  • list.
  • 【工具变量】各地级市人口集聚及多中心程度数据集(2000-2023年)
  • Unity入门笔记(缘更)
  • 习近平在上海考察时强调,加快建成具有全球影响力的科技创新高地
  • 言短意长|新能源领军者密集捐赠母校
  • 暗蓝评《性别打结》丨拆解性别之结需要几步?
  • 昆明破获一起算命破灾诈骗案,民警:大师算不到自己的未来
  • 新疆维吾尔自治区原质量技术监督局局长刘新胜接受审查调查
  • 伊朗内政部长:港口爆炸由于“疏忽”和未遵守安全规定造成