@wenshao 你好,想跟你请教个问题:
在spring mvc中,我用fastjson替换默认是Jackson,有个方法的反序列化出现问题,方法是这么声明的:
@ResponseBody public BaseResp batchImportSomeThing(@RequestBody List<SomeThing> dataList)
其中List的泛型SomeThing是个实现了Serializable接口的类。在使用Jackson时,没有问题,在换成fastjson后系统运行报错:java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.some.package.path.SomeThing
前端传的json数据格式为数组: [{.....}, {.....}],在不改变这个json数据的前提下,如何解决这个问题?我的fastjson版本为1.2.3
是不是要修改com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter类的protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage)方法:
@Override protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream in = inputMessage.getBody(); byte[] buf = new byte[1024]; for (;;) { int len = in.read(buf); if (len == -1) { break; } if (len > 0) { baos.write(buf, 0, len); } } byte[] bytes = baos.toByteArray(); return JSON.parseObject(bytes, 0, bytes.length, charset.newDecoder(), clazz); }
JSON.parseObject这里要判断,如果反序列化的是数组,改用JSON.parseArray可能就对了,但是如何取到具体的泛型类型?
即便修改这方法我觉得也解决不了问题,这里的clazz仅是一个java.util.List,不包含泛型信息。
Class和 ParameterizedType都继承子Type,javaAPI上说:ParameterizedType表示参数化类型,如Collection<String>。 所以只用Class获取不到集合中的类型,再说fastjson中的parseArray中传的Class是集合中的具体类型,也就是说你获取不到那个具体类型即便知道这是个集合用parseArray也不行。
所以问题的根本是拿到 ParameterizedType,也就是List<Something>,直接用parseObject就行。
spring源码基本没读过,写各类继承FastJsonHttpMessageConverter或者把里面的内容复制粘贴一份修改也行
@wenshao请问fastjson现在的版本,有解决这个问题吗?或者fastjson认为这不是个问题,无需解决?这个应该能要支持的,能把问题反馈到githubissue上么,那样我才好找人跟踪处理
https://github.com/alibaba/fastjson/issues
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。