[alibaba/fastjson]从 1.2.29 升级到 1.2.58 出现Long cannot be cast to java.lang.String 异常问题

2024-08-30 166 views
1

static void test1258(){ String ss = "{60000000000149:610,60000000000171:900}"; JSONObject jsonObject = JSONObject.parseObject(ss); System.out.println(jsonObject);

HashMap<Long, Integer> addMap = new HashMap<Long,Integer>();
if (jsonObject != null){
    Set<String> strings = jsonObject.keySet();
    if(CollectionUtils.isNotEmpty(strings)){
        for(String key:strings){
            if(org.apache.commons.lang.math.NumberUtils.isDigits(key)){
                String value = jsonObject.get(key).toString();
                if(org.apache.commons.lang.math.NumberUtils.isDigits(value)){
                    addMap.put(Long.valueOf(key),Integer.valueOf(value));
                }
            }
        }
    }
}

}

元字符串 {60000000000149:610,60000000000171:900} 通过老版本 fastjson 1.2.29 使用 JSONObject jsonObject = JSONObject.parseObject(ss); System.out.println(jsonObject); 打印的结果是 : {"60000000000149":610,"60000000000171":900};

新版本打印的是: {60000000000171:900,60000000000149:610} 代码中使用 Set strings = jsonObject.keySet(); 在 foreach 遍历是用的 String 类型,出现的Long cannot be cast to java.lang.String 异常。

回答

8

你需要这个 static { JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNonStringKeyAsString.getMask(); }

2

或者这个 JSONObject jsonObject =JSON.parseObject(ss,Feature.NonStringKeyAsString);

7

整个公司级别 来做这样的事 成本有点高 , 是否能够详细给出 升级到 1.2.58 所需要修改的不兼容的地方呢 ?

4

经过测试发现,我们自定义的一个 JSON 是 {100:123, 200: 666}, 经过测试和 debug,发现老版本会把 key 统一处理成 String,所以我们的代码获取 key 自动使用 String 就没有问题;而新的版本保留了原始 key 的类型,在我们的代码获取 long 的 key使用 String 就有问题了,目前解决方式是修改了定义的 JSON 为 {"100":123, "200": 666}

5

添加配置文件 文件:fastjson.properties 配置:parser.features.NonStringKeyAsString=true