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
在 foreach 遍历是用的 String 类型,出现的Long cannot be cast to java.lang.String 异常。
你需要这个
static {
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNonStringKeyAsString.getMask();
}
或者这个 JSONObject jsonObject =JSON.parseObject(ss,Feature.NonStringKeyAsString);
整个公司级别 来做这样的事 成本有点高 , 是否能够详细给出 升级到 1.2.58 所需要修改的不兼容的地方呢 ?
整个公司级别 来做这样的事 成本有点高 , 是否能够详细给出 升级到 1.2.58 所需要修改的不兼容的地方呢 ?
经过测试发现,我们自定义的一个 JSON 是 {100:123, 200: 666}, 经过测试和 debug,发现老版本会把 key 统一处理成 String,所以我们的代码获取 key 自动使用 String 就没有问题;而新的版本保留了原始 key 的类型,在我们的代码获取 long 的 key使用 String 就有问题了,目前解决方式是修改了定义的 JSON 为 {"100":123, "200": 666}
添加配置文件
文件:fastjson.properties
配置:parser.features.NonStringKeyAsString=true
Most helpful comment
或者这个 JSONObject jsonObject =JSON.parseObject(ss,Feature.NonStringKeyAsString);