前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >fastjson:对于Exception中复杂类型(enum,...以及自定义类型)成员的处理

fastjson:对于Exception中复杂类型(enum,...以及自定义类型)成员的处理

作者头像
10km
发布于 2018-01-03 06:22:04
发布于 2018-01-03 06:22:04
3.6K00
代码可运行
举报
文章被收录于专栏:10km的专栏10km的专栏
运行总次数:0
代码可运行

如果一个Exception类中有枚举类型或其他复杂类型(比如java.util.Date,或自定义类型)的成员,fastjson反序列化会抛出异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // ServiceSecurityException 类型中 type 成员是个枚举类型SecurityExceptionType
    ServiceSecurityException exp = new ServiceSecurityException("hello").setType(SecurityExceptionType.INVALID_PERSON_ID).setDeviceID(10);
    // 序列化可以正常输出
    System.out.println(JSON.toJSONString(exp));
    // 反序列化就会抛出异常
    JSON.parseObject(JSON.toJSONString(exp), ServiceSecurityException.class);

抛出的异常如下:

com.alibaba.fastjson.JSONException: set property error, type at com.alibaba.fastjson.parser.deserializer.FieldDeserializer.setValue(FieldDeserializer.java:136) at com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer.deserialze(ThrowableDeserializer.java:132) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:626) at com.alibaba.fastjson.JSON.parseObject(JSON.java:348) at com.alibaba.fastjson.JSON.parseObject(JSON.java:252) at com.alibaba.fastjson.JSON.parseObject(JSON.java:471) at net.gdface.facelog.CloneTest.test(CloneTest.java:56)

这应该是个bug,(我用版本的是1.2.38,就是支持java7的最后一个版本,再往后的版本都是java8编译的).跟踪了fastjson的源码,发现用于Exception的反序列化的ThrowableDeserializer代码中对于自定义成员反序列化的逻辑处理过于简单,只考虑了简单数据类型。 看了最新版本1.2.41对应代码,发现这个bug在1.2.41已经解决了,但1.2.41是java8编译的,因为我的项目编译对java版本的要求是java7,所以不能使用。所以这个问题,还得自己想办法解决。

我解决方法是绕开它,因为是在ThrowableDeserializer这里的代码出了问题,所以不能让fastjson以ThrowableDeserializer来实现 序列化和反序列化。

步骤1–序列化过程

将异常类型中需要序列化的字段序列化成一个简单的json string,这样在反序列化时fastjson就不会把它当做一个异常类型交给ThrowableDeserializer来处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public String toJsonString(ServiceSecurityException exp){
        HashMap<String,Object> fields = new HashMap<String,Object>();
        fields.put("type", exp.getType());
        fields.put("deviceID", exp.getDeviceID());
        return JSON.toJSONString(fields);
    }

步骤2–反序列化

JSON.parseObject方法将上一步的json string 反序列化成一个JSONObject对象,

步骤3–反序列化

TypeUtils.castToJavaBean将上一步的JSONObject对象转换为指定的异常类型

代码实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String jsonStr = toJsonString(exp);
JSONObject obj = JSON.parseObject(jsonStr);
ServiceSecurityException newExp = TypeUtils.castToJavaBean(obj, ServiceSecurityException.class);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Fastjson 使用
fastjson 是阿里巴巴的开源 JSON 解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean序列化为JSON字符串,也可以从 JSON 字符串反序列化到 JavaBean。
acc8226
2022/05/17
1.9K0
fastjson链分析(1.2.22-47)
前段时间有师傅来问了我fastjson的问题,虽然知道大概但没分析过具体链,最近有空了正好分析一下fastjson两个反序列化链:
HhhM
2022/08/10
5180
fastjson链分析(1.2.22-47)
fastjson:javabean按字段(field)序列化存储为Map并反序列化
根据用户需求,使用fastjson实现Java Bean按字段序列化为json字符串,再根据该json字符串反序列化回Java Bean。
10km
2018/01/03
2K0
fastjson:javabean按字段(field)序列化存储为Map并反序列化
IDEA动态调试(二)——反序列化漏洞(Fastjson)
成因:在把其他格式的数据反序列化成java类的过程中,由于输入可控,导致可以执行其他恶意命令,但追根究底是需要被反序列化的类中重写了readObject方法,且被重写的readObject方法/调用链中被插入了恶意命令。
Jayway
2020/03/16
2.8K0
IDEA动态调试(二)——反序列化漏洞(Fastjson)
FastJson 反序列化注意事项
问题描述 使用fastJson对json字符串进行反序列化时,有几个点需要注意一下: 反序列化内部类 反序列化模板类 0. Getter/Setter问题 如我们希望返回的一个json串为 "name" : "name", "isDeleted" : true, "isEmpty" : 1 下面是我们的定义的dto对象,通过序列化后能得到我们预期的结果么? private String name; private boolean isDeleted; private int isEmpty; publ
一灰灰blog
2018/02/06
6.9K0
FastJson 反序列化注意事项
fastjson详解
  fastjson用于将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。
良辰美景TT
2018/09/11
3.4K0
fastjson详解
fastjson:实现对java.nio.ByteBuffer数据类型的支持
该文介绍了如何利用FastJSON库实现Java对象序列化和反序列化,同时介绍了如何使用ByteBuffer来实现二进制数据的序列化和反序列化。此外,还提供了一个使用示例,以展示如何在实际项目中使用FastJSON库和ByteBuffer来实现对象序列化和反序列化。"
10km
2018/01/03
1.8K0
JSON 多态反序列化属性/类型丢失问题
工作中有时候会遇到一个类定义了某个类型的父类作为成员变量,实际存放的为某个子类型, JSON 反序列化后,属性丢失的情况。
明明如月学长
2021/10/18
4.4K0
FastJson的使用
FastJson 的Wiki在这里:https://github.com/alibaba/fastjson/wiki/
bear_fish
2018/09/19
1.6K0
FastJSON 源码分析
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。
Yano_nankai
2018/10/08
1.1K0
阿里fastjson框架基础
fastjson 是阿里巴巴公司开源的一个json序列化、反序列化轻量级框架,号称最快。 是因为其内置算法的增强,以及序列化时对class进行了细节的微妙处理,更多细节请查看其项目源码:https://github.com/alibaba/fastjson 常用方法示例:
青山师
2023/05/05
2960
fastJson的JSONField注解
然后是deserialize:默认为true,如果为false,反序列化时会忽略该属性
阿超
2022/08/16
1.5K0
fastJson的JSONField注解
FastJson 笔记
观察该类的继承与实现关系,不难发现,JSONObject 实现了 Map 接口,而 json 对象中的数据都是以”键:值”对形式出现,可以猜想, JSONObject 底层操作是由Map实现的。
Remember_Ray
2020/03/09
4.5K0
com.alibaba.fastjson简介及常用API
com.alibaba.fastjson是阿里巴巴集团开发的一款高性能、功能完善的Java JSON库。它提供了丰富的API,可以轻松地将Java对象序列化为JSON字符串,或将JSON字符串反序列化为Java对象。fastjson广泛应用于各种Java Web应用、移动应用以及大数据处理场景,具有稳定、高效、易用等特点。在平时开发中,一般需要吧接口响应数据装换成json返回给前端,所以fastjson使用范围还是很广的,也很频繁,所以本文主要来介绍fastjson常用API。
小明爱吃火锅
2024/06/13
2K0
用了几年的 Fastjson,最终替换成了 Jackson!
> 公众号:[Java小咖秀](https://t.1yb.co/jwkk),网站:[javaxks.com](https://www.javaxks.com)
Java小咖秀
2021/05/06
2.3K0
SpringBoot - FastJson
​ fastjson提供了JSONField对序列化与反序列化进行定制,比如可以指定字段的名称,序列化的顺序。JSONField用于属性,方法方法参数上。JSONField的源码如下:
郭顺发
2021/12/17
1.8K0
用了几年的 Fastjson,我最终替换成了Jackson!
作者:larva-zhh 来源:www.cnblogs.com/larva-zhh/p/11544317.html
Java技术栈
2021/05/11
5.6K0
Java反序列化(十二) | Fastjson②1.2.24-68总结
介绍什么的就不说了,简介以及1.2.24的复现和详细分析可以看 Java反序列化(十) | Fastjson – CVE-2017-18349
h0cksr
2023/05/17
8910
Java反序列化(十二) | Fastjson②1.2.24-68总结
利用JdbcRowSetImpl链对Fastjson1.2.23Jndi注入
Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等多种应用场景。
FB客服
2022/11/14
2980
利用JdbcRowSetImpl链对Fastjson1.2.23Jndi注入
浅析FastJSON反序列化漏洞(1.2.24——1.2.68)
FastJson 是一个由阿里巴巴研发的java库,可以把java对象转换为JSON格式,也可以把JSON字符串转换为对象。
ConsT27
2022/03/15
17.4K0
浅析FastJSON反序列化漏洞(1.2.24——1.2.68)
相关推荐
Fastjson 使用
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验