alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.71k stars 6.5k forks source link

Map类型反序列化时默认是解析成JSONObject类型 #4455

Open SevenZhou opened 10 months ago

SevenZhou commented 10 months ago

引用 com.alibaba:fastjson:2.0.41 的包,反序列化Map属性的类型时,会解析成JSONObject,例如 类型 public class DemoInfo { Map<Integer, String> mapInfo; }

字符串 {"mapInfo":{0:"t0"}}
调用 DemoInfo demoInfo = JSON.parseObject(config, new TypeReference(){}.getType()); 转换成demo对象, mapInfo属性会被转换成 com.alibaba.fastjson.JSONObject 的类型,JSONObject 继承的是 Map<String, Object>,其泛型要求key为字符串,导致后续 mapInfo.put(1,"t1") 方法报类型转换的错误。

测试引用最新的fastjson2的包 com.alibaba.fastjson2:fastjson2:2.0.41,反序列化时,解析出来的mapInfo是 HashMap类型,是正确的。 测试引用以前版本的 com.alibaba:fastjson:1.2.83 反序列化解析的mapInfo也是 HashMap类型。

应该是 fastjson-2.0.41.jar 的问题,这样会导致从 fastjson-1.2.83.jar 直接升级到 fastjson-2.0.41.jar 不兼容,与 fastjson2-2.0.41.jar也不兼容。

SevenZhou commented 10 months ago

测试代码 ` import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import lombok.Data;

import java.util.Map;

//import com.alibaba.fastjson2.JSON; //import com.alibaba.fastjson2.TypeReference;

public class JsonTest { @Data public static class DemoInfo { Map<Integer, String> mapInfo; }

public static void main(String[] args) {
    String demoStr = "{\"mapInfo\":{0:\"t0\"}}";
    DemoInfo demoInfo = JSON.parseObject(demoStr, new TypeReference<DemoInfo>(){}.getType());
    System.out.println(demoInfo);
    System.out.println(demoInfo.getMapInfo().getClass());
    demoInfo.getMapInfo().put(1,"t1");
}

} `

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String