fastjson版本升级遇到的问题

fastjson版本升级遇到的问题

    • 问题背景
    • 版本
      • 问题
        • 问题1
        • 问题2

问题背景

由于我司的项目部署阿里云上,最近一天收到阿里云的的漏洞提醒!邮件。检查项目后发现,确实存在低版本的fastjson。考虑到项目安全性,项目组决定升级fastjson包。
fastjson版本升级遇到的问题_第1张图片

版本

fastjson1.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 = json.getJSONArray("test2");
for (Object obj : dataList) {
    System.out.println(obj.getClass());
}

两个版本的结果却又是一致的:com.alibaba.fastjson.JSONObject

跟踪json的来源,发现来自于Controller@RequestBody的参数,近两个版本验证,发现json的子属性中的JSONArray的存储的对象类型确实存在差异。

原因如下:JSONObject.class下的getJSONArray的重构,造成了上述差异。

#1.2.44
public JSONArray getJSONArray(String key) {
        Object value = this.map.get(key);
        if (value instanceof JSONArray) {
            return (JSONArray)value;
        } else {
            return value instanceof String ? (JSONArray)JSON.parse((String)value) : (JSONArray)toJSON(value);
        }
    }

#1.2.68
public JSONArray getJSONArray(String key) {
        Object value = this.map.get(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

JSONObjecttoString()JSONObject.toJSONString(obj)的差异

String str = "{\"key1\":[\"value11\"]}";
        JSONObject obj =JSONObject.parseObject(str);
        JSONArray k1 = obj.getJSONArray("key1");
        for(Object obj1 :k1){
            System.out.println(obj1.toString());
            System.out.println(JSONObject.toJSONString(obj1));
        }

上述代码执行结果:value11 、"value11"

你可能感兴趣的:(问题分析)