遭遇fastjson的一个坑
2016-09-25 17:51
246 查看
最近在开发过程中踩到到了fastjson的一个坑,写出来跟大家分享一下,同时也留个记录。
情况是这样子的,我们中间件是采用fastjson来进行序列化的,我们自己在代码中定义一个
如下实例化一个
预计json序列化结果为:
而实际用“,输出的json确实如下:
发现了没,序列化的json中多了一个
而不是:
这主要是Response不是一个标准的POJO类,
其实解决办法很简单,使用标准的POJO或者修改一下
因此建议大家在使用类似于fastjson这种工具进行序列化时要注意改问题,避免这种悲剧的重演。
情况是这样子的,我们中间件是采用fastjson来进行序列化的,我们自己在代码中定义一个
Response类用于封装两个系统之间交换的数据,代码简化版大致如下:
public class Response<T> { private int status;//用于标志调用状态 private T data;//实际数据 public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public T getData() { return data; } public void setData(T data) { this.data = data; } public boolean isSuccess() { return data != null ? true : false; } public void setSuccess(T data){ this.data = data; this.status = SUCCESS; //do something success } @Override public String toString() { return "Response{" + "status=" + status + ", data=" + data + '}'; } }
Response类中封装一个泛类型的
data成员为实际需要的数据,定义的
data的
get和
set方法,定义的一个
isSuccess()方法来判定系统是否成功给client端用。定义了一个
setSuccess()方法给server端用。
如下实例化一个
Response对象:
Response<String> response = new Response<>(); response.setData("test"); response.setStatus(0); String json = JSON.toJSONString(response);//fastjson序列化 System.out.println(json);//打印出序列化json response = JSON.parseObject(json, Response.class);//fastjson序列化反java对象 System.out.println(response);//打印出反序列化java对象
预计json序列化结果为:
{"data":"test","status":0}
而实际用“,输出的json确实如下:
{"data":"test","status":0,"success":true}
发现了没,序列化的json中多了一个
success,这跟设计的不太一样啊!!这可不是我要的结果….多了个对实际程序影响还没有那么大,更坑爹的还在后面的反序列化,输出结果如下:
Response{status=0, data=true}
而不是:
Response{status=0, data="test"}
data中的数据被篡改了,类型都不对了有木有…这将导致很严重的后果!
这主要是Response不是一个标准的POJO类,
isSuccess()和
setSuccess()刚好被fastjson多解析为
success的
get和
set方法,然后
setSuccess()在反序列化时把序列化结果中的
success值覆盖掉了data,多个条件碰到了一起,造成了悲剧…
其实解决办法很简单,使用标准的POJO或者修改一下
isSuccess()或
setSuccess()方法名即可。
因此建议大家在使用类似于fastjson这种工具进行序列化时要注意改问题,避免这种悲剧的重演。
相关文章推荐
- 一个由proguard与fastJson引起的血案
- FastJson处理json数据时遇到一个问题
- 一个基于STSdb和fastJson的磁盘/内存缓存
- Fastjson反序列化泛型类型时候的一个问题
- 一个简单的fastJson实例
- fastjson反序列化一个字段有多个set方法时的问题
- FastJSON使用的一个误区
- 一个由proguard与fastJson引起的血案(转)
- fastJSON☞JSONParameters☞时区的修改☞时间最后有一个"Z"
- fastJson如何序列化一个包含list对象的Map对象,如Map<String,List<T>>类型的对象
- java中解析一个json串,本文详细介绍了安卓原生的解析以及用fastjson解析
- java:利用fastjson判断一个类型(java.lang.reflect.Type)是否是一个javabean
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
- 一个由PROGUARD与FASTJSON引起的血案
- 用fastjson反序列化时的一个需要注意的地方
- 关于fastjson的一个坑:输出json时,bean对象属性首字母默认被小写
- 自己编写的一个Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加载对象
- [原创]开发一个适合Ajax+JSON+jQuery环境使用的多功能页码栏——jPagerBar-1.1.1
- 学习EXT第七日-View&JSONView Part Two-一个画室网站的案例
- [原创]用递归写的一个object 转换成JSON的函数