开发避坑指南(69):FastJSON 解析非标准 JSON 数据异常排查与解决方案

从fastjson迁移到Jackson:反序列化漏洞与Java JSON库选型思考 JSON解析是Java后端开发中最常见的技术操作之一,负责在对象与文本之间完成数据交换。在处理序列化与反序列化时,开发者往往关注性能与API简洁性,却容易忽略底层机制可能引入的安全隐患。fastjson曾以高性能著称,但其autoType机制多次触发反序列化漏洞,形成“修复-绕过-再修复”的循环,导致线上系统长期暴露在远程命令执行风险中。相比之下,Spring Boot默认集成的Jackson拥有稳定的漏洞响应机制和完整的生态支持,更适合作为核心链路的JSON处理方案。本文从漏洞原理出发,分析fastjso 阅读详情

异常背景

在使用fastjson/fastjson2解析以下json数据的时候报错。

json数据

{
    "code": "0000",
    "data": [
        {
            "msg": "创建订单成功",
            "code": 325,
            "orderNO": "563225463214723",
            "tkNumber": "36235423157",
            "bmInfo": [
                [
                    {
                        "recetFdmc": "",
                        "mcInfos": {
                            "PRI": {
                                "value": {
                                    "priConfig": [
                                        0,
                                        1
                                    ]
                                }
                            }
                        },
                        "batch_code": "C200000",
                        "acc_phone": "",
                        "warse_no": ""
                    },
                    [
                        "32321",
                        "1323"
                    ]
                ]
            ]
        },
        {
            "msg": "创建订单成功",
            "code": 325,
            "orderNO": "563225463214724",
            "tkNumber": "36235423158",
            "bmInfo": [
                [
                    {
                        "recetFdmc": "",
                        "mcInfos": {
                            "PRI": {
                                "value": {
                                    "priConfig": [
                                        0,
                                        1
                                    ]
                                }
                            }
                        },
                        "batch_code": "M200000",
                        "acc_phone": "",
                        "warse_no": ""
                    },
                    [
                        "32321",
                        "1323"
                    ]
                ]
            ]
        }
    ],
    "message": "请求成功",
    "result": true,
}

报错信息

使用fastjson报错

Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 275, fastjson-version 1.2.83
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:506)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseRest(JavaBeanDeserializer.java:1624)
	at com.alibaba.fastjson.parser.deserializer.FastjsonASMDeserializer_3_PdfInfo.deserialze(Unknown Source)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:792)
	at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:132)
	at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseArray(ArrayListTypeFieldDeserializer.java:185)
	at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseField(ArrayListTypeFieldDeserializer.java:71)

使用fastjson2报错

expect {, but [, class com.xxx.xxx, parent fieldName bmInfo, offset 142, character [, line 1, column 143, fastjson-version 2.0.34 

解析代码

ApiResponse apiResponse = JSON.parseObject(ret, ApiResponse.class);

相关实体

根据json结构创建对应实体类

@Getter
@Setter
public class ApiResponse {
    private String code;
    private List<OrderData> data;
    private String message;
    private Boolean result;
    private String sub_code;
    private String sub_msg;
}

@Getter
@Setter
public class OrderData {
    private String msg;
    private Integer code;
    private String orderNO;
    private String tkNumber;
    private List<List<JsonData>> bmInfo;
    //private List<List<Object>> bmInfo;
}

@Getter
@Setter
public class JsonData {
    private String recetFdmc;
    private McInfos mcInfos;
    private String batch_code;
    private String acc_phone;
    private String warse_no;
}

@Getter
@Setter
class McInfos {
    private PRI PRI;
}

@Getter
@Setter
class PRI {
    private Value value;
}

@Getter
@Setter
class Value {
    private List<Integer> priConfig;
}

异常分析

使用fastjson和fastjson2解析都报错了,说明不是fastjson版本的问题。

从fastjson2解析时的报错信息看,在解析bmInfo节点时出错,期望‌左花括号 {(表示JSON对象的开始,实际‌左方括号 [(表示JSON数组的开始)。

仔细看bmInfo节点的数据结构,这并不是标准的JSON格式‌,在数组内部混合了对象 {} 和数组 [] 类型。这种混合结构虽然在JSON解析器中可以解析,但不符合JSON的最佳实践,所以用fastjson工具解析报错了。

解决办法

对于bmInfo节点的解析,不能使用List<List> 类型的对象去接收,应该改成List<List>类型的对象,示例代码如下:

public class JsonFileParser {

    public static void main(String[] args) {
        try {
            // 接口返回的json字符串
            String ret="json字符串";
			ApiResponse apiResponse = JSON.parseObject(ret, ApiResponse.class);

            // 输出解析结果摘要
            System.out.println("=== JSON解析结果 ===");
            System.out.println("响应状态码: " + response.getCode());
            System.out.println("响应消息: " + response.getMessage());
            System.out.println("请求结果: " + response.getResult());
            System.out.println("订单数量: " + response.getData().size());
            System.out.println();

            // 详细遍历每个订单信息
            int orderIndex = 1;
            for (OrderData order : response.getData()) {
                System.out.println("订单 " + orderIndex + ":");
                System.out.println("  订单号: " + order.getOrderNO());
                System.out.println("  运单号: " + order.getTkNumber());
                System.out.println("  消息: " + order.getMsg());
                System.out.println("  状态码: " + order.getCode());

                // 处理bmInfo复杂结构
                if (order.getBmInfo() != null && !order.getBmInfo().isEmpty()) {
                    System.out.println("  批量信息:");
                    for (List<Object> batchItem : order.getBmInfo()) {
                        for (Object item : batchItem) {
                            if (item instanceof Map) {
                                // 处理对象类型数据
                                Map<String, Object> batchDetail = (Map<String, Object>) item;
                                System.out.println("    批次代码: " + batchDetail.get("batch_code"));
                                System.out.println("    收货电话: " + batchDetail.get("acc_phone"));

                                // 处理mcInfos嵌套结构
                                Map<String, Object> mcInfos = (Map<String, Object>) batchDetail.get("mcInfos");
                                if (mcInfos != null && mcInfos.containsKey("PRI")) {
                                    Map<String, Object> priInfo = (Map<String, Object>) mcInfos.get("PRI");
                                    Map<String, Object> valueInfo = (Map<String, Object>) priInfo.get("value");
                                    List<Integer> priConfig = (List<Integer>) valueInfo.get("priConfig");
                                    System.out.println("    隐私配置: " + priConfig);
                                }
                            } else if (item instanceof List) {
                                // 处理数组类型数据
                                List<Object> arrayData = (List<Object>) item;
                                System.out.println("    附加数据: " + arrayData);
                            }
                        }
                    }
                }
                System.out.println();
                orderIndex++;
            }

        } catch (IOException e) {
            System.err.println("解析JSON文件时发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
从原理到实战:深入解析Fastjson反序列化漏洞与安全防御 JSON序列化与反序列化是现代Web应用数据交换的核心技术,其原理是将对象状态转换为可传输的字符串格式,并在接收端还原。然而,当反序列化过程允许用户控制被还原的类时,就可能触发不安全的反序列化漏洞,这是Java安全领域一个经典且高危的攻击面。该漏洞的技术价值在于,攻击者可以构造恶意数据,利用应用依赖的库中存在的危险方法链(Gadget Chain),在目标服务器上执行任意代码,实现远程控制。其应用场景广泛,常见于接收JSON格式用户输入的API接口、微服务间的数据传输以及配置文件解析等环节。本文聚焦于业界广 阅读详情

相关推荐

从踩坑到精通:Spring Boot项目整合FastJson时,你必须绕开的5个常见配置陷阱

本文深入探讨了Spring Boot项目整合FastJson时常见的5个配置陷阱,包括HttpMessageConverter配置、循环引用处理、版本兼容性、Spring MVC参数解析和性能调优。通过实战案例和详细代码示例,帮助开发者避免常见错误,提升JSON处理效率与安全性。

weixin_33725270的博客 679

JSON转换异常

异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException & java.lang.NullPointerExcept 异常是在执行下面的语句出现的: JSONArray array = JSONArray.fromObject(this.users); 出现这bug,有两种情况: 1、日期格式  2

牛仔不肥的笔记 2938

write javaBean error, fastjson version 1.2.68, class org.springframework.web.multipart.support.Stand

一、问题背景 这两天在springboot项目中遇到个让人摸不着头脑的问题,一个接口准备上传excel文件并解析到数据库中,结果运行的时候报错了,具体信息如下: ERROR 62 [,] [http-nio-8090-exec-2] adminLogger 系统异常 com.alibaba.fastjson.JSONException: write javaBean error, fastjson version 1.2.68, class org.springframework.web.multipar

墨殇 1万+

记录碰到的json转换异常

对接接口时忽略不必要字段

weixin_43470118的博客 1380

69.渗透-BurpSuite-Extensions(插件HaE与TsojanScan的实战协同)

本文详细介绍了BurpSuite插件HaE与TsojanScan在渗透测试中的协同应用。HaE通过正则表达式高亮标记敏感信息,TsojanScan则整合多种漏洞检测能力,两者结合可显著提升漏洞挖掘效率。文章涵盖插件安装、配置优化及实战案例,为安全测试人员提供高效工具组合方案。

weixin_28607671的博客 382

Claude原生API替代LIPAL抽象层的技术演进与迁移实践

在大模型基础设施快速成熟背景下,轻量级推理协议抽象层(LIPAL)这类中间胶水组件正被原生API能力全面覆盖。其本质是模型服务能力从‘需客户端预处理’向‘端到端原生支持’的范式升级:上下文长度突破200K tokens、流式响应延迟压至毫秒级、sub-token级精准计费、Constitutional AI内置安全拦截等原生特性,使传统分片、预估、帧封装等中间逻辑失去存在基础。本文基于金融、法律、医疗等高确定性场景的真实迁移经验,详解LIPAL弃用动因、性能与成本双维度收益,以及TokenGate偏差、St

weixin_30542079的博客 630

Fastjson简单学习

依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.36</version> </dependency> 先整个简单的bean public class Person { private String name; private.

weixin_45149355的博客 1261

从逆向思维到实战:漏洞挖掘入门核心技能与路径解析

漏洞挖掘是网络安全领域的核心实践,其本质是一种基于逆向思维的工程方法。从原理层面看,它要求研究者深入理解计算机网络协议、操作系统机制及应用程序逻辑,通过模拟攻击者视角发现系统缺陷。技术价值在于主动识别风险,提升软件与系统的安全性,是构建纵深防御体系的关键环节。在应用场景上,广泛覆盖Web应用、移动端、云原生及物联网等领域,其中Web安全因场景普遍而成为最佳入门切入点。掌握如SQL注入、XSS等常见漏洞的原理与手工测试方法,并熟练使用Burp Suite等代理工具进行抓包与漏洞验证,是构建实战能力的基础。本文

429

com.alibaba.fastjson.JSONException field null expect ‘[‘, but {, pos 1, line 1,

json字符串转 List对象时出现如下异常: com.alibaba.fastjson.JSONException: field null expect '[', but {, pos 1, line 1, column 2{。。。。。 at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:741) java实现的后台逻辑: String tasksInfos = getMapValu

m0_67393619的博客 1万+

任意代码执行漏洞深度解析:从原理到防御的实战指南

在Web安全领域,代码执行与命令注入是危害性极高的漏洞类型,其核心原理在于程序错误地将用户输入作为指令执行,导致信任边界被突破。从技术实现上看,这通常源于对用户输入数据验证不足,或危险函数的不当调用,使得攻击者能在服务器上下文中执行任意代码或系统命令。这类漏洞的技术价值在于其直接威胁服务器控制权,常被用于数据窃取、服务中断或作为内网渗透的跳板。在应用场景上,常见于存在动态代码执行、系统命令调用或反序列化功能的Web应用、API接口及网络设备管理后台中。本文聚焦于任意代码执行漏洞,深入剖析其产生机制,并结合命

weixin_30333885的博客 353

JAVA 经常遇到一些问题【第一部分1~35】

JAVA 经常遇到一些问题

A-MING的博客 1万+

SpringBoot+Vue学生心理咨询评估系统毕设源码全解析

前后端分离架构是当前Web开发的主流模式,SpringBoot与Vue的组合凭借开发高效、结构清晰的优势,被广泛应用于各类信息管理系统。RESTful接口设计、JWT身份认证、数据库表关系建模等基础原理,构成了一个完整业务闭环的底层支撑。对于正处于Java Web毕业设计阶段的学生而言,选择这一技术栈既能快速搭建可运行的项目原型,又能清晰展示工程化能力与安全设计思路。本文以一个完整的学生心理咨询评估系统为例,深入拆解其功能模块、数据库表结构、核心接口实现、前端联调要点以及部署上线中的常见问题与避坑方案,帮助

WGH100817的博客 387

基于Java的储能平台后端源码解析:Spring Boot与Modbus采集链路落地实践

储能系统的数据采集与监控后端,是一套围绕设备接入、实时状态处理与告警推送的工程体系。在工业物联网场景中,Modbus协议是连接BMS、PCS、电表等设备的常见通信标准,而Java技术栈中的Spring Boot、MyBatis和Redis则提供了从数据解析到存储展示的完整支撑。理解设备寄存器轮询、协议解码、实时缓存与历史落库的分工协作,是搭建可落地储能监控平台的关键。本文以一套实验室储能平台后端为例,拆解采集链路设计、技术选型逻辑与部署避坑要点,并讨论从轮询模式演进到MQTT主动上报的改造路径,为Java开

weixin_34174322的博客 181

js代码效率和java代码执行效率哪个更高_Fastjson 远程代码执行漏洞来袭,autotype 开关限制可被绕过...

0x01 漏洞背景2020年05月28日, 360CERT监测发现业内安全厂商发布了Fastjson远程代码执行漏洞的风险通告,漏洞等级:高危。Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。Fastjson存在远程代码执行漏洞,autotype开关的限制可以...

weixin_39991531的博客 95

基于SpringBoot+Vue的在线考试系统设计与实现

从全栈开发视角出发,SpringBoot以“约定优于配置”简化后端搭建,MySQL依靠事务机制保障成绩数据一致性,Vue的响应式特性则让答题交互更流畅。系统基于JWT实现无状态登录认证,配合随机组卷、自动判分、切屏检测与成绩统计可视化,构建了从题库管理到考试分析的全流程闭环。该方案不仅适合作为毕业设计参考,也适用于快速搭建企业内部培训考核平台。部署环节重点攻克时区配置、跨域处理、history路由刷新404等常见问题,并可通过引入人脸识别或智能组卷算法进一步扩展系统能力,是一套兼具工程实践价值与二次开发空间

weixin_34088583的博客 421

基于SSM的酒店管理系统毕业设计:从环境搭建到答辩加分

SSM(Spring+SpringMVC+MyBatis)是Java后端开发中经典的框架组合,以其分层清晰、配置显式的特点常被用于教学与毕业设计。理解其原理,有助于掌握请求分发、依赖注入、SQL映射等核心机制,也为后续迁移Spring Boot打下基础。在酒店管理系统中,这些技术通过订单状态流转、房态管理等业务场景得到实践落地。本文围绕如何将一套基于SSM的酒店管理系统源码跑通并深化,从Maven依赖、Tomcat配置、MySQL连接等环境搭建,到数据库初始化和功能改造,系统梳理了环境配置、事务处理、Map

weixin_34178244的博客 356

PHP反序列化漏洞深度解析:从CTF技巧到实战防御

序列化与反序列化是编程中常见的数据持久化与传输机制,其核心原理是将对象状态转换为可存储或传输的字符串格式,并在需要时重建对象。在PHP中,这一过程通过serialize()和unserialize()函数实现,但若处理不当,攻击者可能通过精心构造的序列化字符串注入恶意对象属性或触发危险魔术方法,从而引发安全漏洞。这类漏洞的技术价值在于其往往位于应用逻辑深层,能够绕过常规输入验证,直接操控程序内部状态。在CTF竞赛与实战渗透中,PHP反序列化常与属性注入、魔术方法链(POP链)利用、字符串过滤绕过等技巧结合,

weixin_30239339的博客 327

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 493

嘉立创EDA版本冲突根因与工程化治理方案

EDA工具链中的版本问题并非简单兼容性缺陷,而是多维依赖空间(操作系统、JVM、Node.js、Python生态、GPU驱动、WebKit内核等)在语义化版本约束下的坐标偏移现象。其本质是客户端与服务端、本地与云端、GUI与Runtime之间隐性契约的失效,典型表现为工程文件加载失败、AI助手白屏、器件渲染异常等。解决路径需超越‘升级/降级’直觉,转向运行时隔离、依赖锁死、容器固化与自动化验证——尤其在嘉立创EDA等国产EDA工具中,版本组合未经验证已成为83%现场工单的根源。本文聚焦Ubuntu环境下的实

weixin_34242331的博客 432

单细胞转录组肿瘤细胞识别:inferCNV与CopyKAT实战解析

单细胞转录组测序(scRNA-seq)是解析肿瘤微环境的重要技术,但如何从海量细胞中准确区分恶性细胞与正常细胞,始终是数据分析的关键难题。传统marker注释在异质性肿瘤中常失效,而基于拷贝数变异(CNV)的推断方法为这一问题提供了更稳健的解决路径。CNV通过检测染色体大片段的增益或缺失,可在无先验标记的情况下识别恶性细胞,尤其适合实体瘤研究。inferCNV利用染色体滑动窗口分析相对表达量,生成直观的CNV热图;CopyKAT则结合高斯混合模型对每个细胞直接分类,输出肿瘤/正常/非整倍体标签。本文从原理出

weixin_31236101的博客 249

3大绝招!MySQL如何轻松搞定文本、图像和视频的多模态数据分析?

首先,让我们来了解一下“多模态”到底是什么意思。简单来说,多模态指的是能够同时处理不同类型数据(如文本、图像、音频等)的能力。传统的数据库往往只能专注于一种或几种特定类型的数据,比如关系型数据库主要处理结构化数据,而文档型数据库则更适合非结构化数据。但是现在,随着技术的进步,像MySQL这样的数据库也开始支持更加复杂的数据模型,允许我们在同一个系统内处理多种格式的数据。通过上述五个部分的详细介绍,相信你现在应该对如何利用MySQL进行多模态数据分析有了更清晰的认识。

java专栏 2114
上一篇: 并发编程原理与实战(三十六)深入解析 ThreadLocal 在 Spring 框架中的核心应用与实战技巧
下一篇: 并发编程原理与实战(三十七)高并发利器ConcurrentHashMap核心特性解析
帧栈
博客等级 码龄2年 335粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

帧栈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值