您的位置:首页 > Web前端 > JavaScript

遭遇fastjson的一个坑

2016-09-25 17:51 246 查看
最近在开发过程中踩到到了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这种工具进行序列化时要注意改问题,避免这种悲剧的重演。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java json 序列化 fastjson