com.alibaba.fastjson.JSONException: not close json text, token : error

今天遇到一个相当智障的问题,前端传参数到后端,后端直接报json解析错误,not close?? 听着就很奇怪,关键有的时候正常,有的时候不正常。于是先在浏览器中F12,看传的参数 感觉 没问题,在后端filter中获得request的body,打印出来,很长,也看不出来问题。

1、先来看一下用以接收参数的dto

bash 复制代码
@Data
public class DeliveryFeeProcessDTO extends TDeliveryFeeProcessRecord {

    /**
     * 货物明细
     */
    private List<TDeliveryFeeProcessGoodsInfo> goodsList;

    /**
     * 文件列表
     */
    private List<FileInfo> fileList;

    /**
     * 1 通过
     * 0 驳回
     */
    private Integer state;
}

项目中配置的是fastjson,1.2.83

bash 复制代码
  http:
    converters:
      preferred-json-mapper: fastjson       # Json转换器


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

可以看到有两个list 比较可疑··

2、看一下我精简后的json 字符串,这也能报错?

bash 复制代码
{"creatorId": "superadmin","goodsList": "","fileList": ""}

3、写一个demo

bash 复制代码
public static void main(String[] args) {
//        String json = "{\"creatorId\": \"superadmin\",\"goodsList\": \"\",\"fileList\": []}";
        dealJson("{\"creatorId\": \"superadmin\",\"goodsList\": \"\"}");
        dealJson("{\"creatorId\": \"superadmin\",\"fileList\": \"\"}");
        dealJson("{\"creatorId\": \"superadmin\",\"goodsList\": []}");
        dealJson("{\"creatorId\": \"superadmin\",\"fileList\": []}");
        dealJson("{\"creatorId\": \"superadmin\",\"goodsList\": \"\",\"fileList\": []}");
        dealJson("{\"creatorId\": \"superadmin\",\"goodsList\": \"\",\"fileList\": \"\"}");
        dealJson("{\"creatorId\": \"superadmin\",\"goodsList\": [],\"fileList\": []}");
        dealJson("{\"creatorId\": \"superadmin\",\"goodsList\": [],\"fileList\": \"\"}");
    }

    private static void dealJson(String json) {
        Boolean flag = true;
        try {
            DeliveryFeeProcessDTO dto = JSONObject.parseObject(json, DeliveryFeeProcessDTO.class);
        }catch (Exception e){
            flag = false;
//            System.out.println(json);
            System.out.println(e.getMessage());
//            e.printStackTrace();
        }
        if(flag){
            System.out.println("PASS"+json);
        }else {
            System.out.println("FAILED"+json);
        }
    }

出来的结果是

bash 复制代码
FAILED{"creatorId": "superadmin","goodsList": ""}
FAILED{"creatorId": "superadmin","fileList": ""}
PASS{"creatorId": "superadmin","goodsList": []}
PASS{"creatorId": "superadmin","fileList": []}
FAILED{"creatorId": "superadmin","goodsList": "","fileList": []}
FAILED{"creatorId": "superadmin","goodsList": "","fileList": ""}
PASS{"creatorId": "superadmin","goodsList": [],"fileList": []}
PASS{"creatorId": "superadmin","goodsList": [],"fileList": ""}

可以看到,应该是因为List不能是空字符串,必须是空数组才行

但是最后一个就很鬼畜了!!竟然PASS了!

好了,省流(我懒得去翻fastjson的源码,更懒得去看fastjson的release note)。解决办法是升级····简单粗暴。在maven仓库中查到最新是2.0.53

bash 复制代码
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.53</version>
        </dependency>

所以,每当你以为自己技术还行的时候,就会在小坑里栽跟头

相关推荐
xbzb2 天前
镜像到底存在哪:/var/lib/docker 的四级映射与 daemon.json 配置
docker·容器·json·镜像·daemon.json·四级
坤坤子吖2 天前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
code2cat2 天前
【随笔】结构化输出:JSON格式过关,业务数据就能入库吗
json·大语言模型
Hello_Pyhx6 天前
NWinfo 导出 Windows 硬件信息:从 JSON 报告到缺项排查
windows·json
程序员大阳7 天前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
视觉小萌新8 天前
AI Class 3 · Chapter 2-3:函数、异常、文件读写+JSON / JSONL 读写(小白版)
人工智能·python·json
翊众建站8 天前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Patrick_Wilson9 天前
读懂一个 Go JSON 处理函数:从输入数据追踪结构体、校验与错误返回
go·json·编程语言
January120710 天前
【AI方法笔记】2026-11-02:模型流式吐 JSON 时,前端会遇到四种崩法
前端·人工智能·笔记·json