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

m0rkklqb  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(45)

引用 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也不兼容。

polhcujo

polhcujo1#

测试代码
`
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

相关问题