fastjson版本升级遇到的问题
fastjson版本升级遇到的问题
问题背景
由于我司的项⽬部署阿⾥云上,最近⼀天收到阿⾥云的的漏洞提醒!邮件。检查项⽬后发现,确实存在低版本的fastjson。考虑到项⽬安全性,项⽬组决定升级fastjson包。
版本
fastjson:1.2.44升级⾄1.2.68
问题
版本升级后,发现原项⽬中的某些业务报错,跟踪后发现现象如下:
问题1
JSONArray中存储的对象类型发⽣了变化,在对⽐两个版本的结果:
1.2.44版本的存储对象的类型为:JSONObject
1.2.68版本的存储对象的类型为:LinkedHashMap
后继续跟踪并测试发现:
String jsonStr ="{\"test1\":{\"test11\":\"test11\"},"+
"\"test2\":[{\"test21\":\"test21\",\"test22\":\"test22\"}]}";
JSONObject json = JSONObject.parseObject(jsonStr);
JSONArray dataList = JSONArray("test2");
for(Object obj : dataList){
System.out.Class());
}
两个版本的结果却⼜是⼀致的:com.alibaba.fastjson.JSONObject。
跟踪json的来源,发现来⾃于Controller的@RequestBody的参数,近两个版本验证,发现json的⼦属性中的JSONArray的存储的对象类型确实存在差异。
原因如下:JSONObject.class下的getJSONArray的重构,造成了上述差异。
#1.2.44
public JSONArray getJSONArray(String key){
Object value =(key);
if(value instanceof JSONArray){
return(JSONArray)value;
}else{
return value instanceof String ?(JSONArray)JSON.parse((String)value):(JSONArray)toJSON(value);
}
}
fastjson忽略属性#1.2.68
public JSONArray getJSONArray(String key){
Object value =(key);
if(value instanceof JSONArray){
return(JSONArray)value;
}else if(value instanceof List){
return new JSONArray((List)value);
}else{
return value instanceof String ?(JSONArray)JSON.parse((String)value):(JSONArray)toJSON(value);
}
}
问题2
JSONObject的toString()和JSONString(obj)的差异
String str ="{\"key1\":[\"value11\"]}";
JSONObject obj =JSONObject.parseObject(str);
JSONArray k1 = JSONArray("key1");
for(Object obj1 :k1){
System.out.String());
System.out.JSONString(obj1));
}
上述代码执⾏结果:value11 、"value11"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论