Request: { "name":"alice", "age":"11", "xxx":{ "aa":"aaValue" "bb":"bbValue" } } Controller public JSONObject weChatPayResponseV3(@RequestBody JSONObject requestBody){ requestBody.getJSONObject("xxx") 报错 ---> java.util.LinkedHashMap cannot be cast to com.alibaba.fastjson2.JSONObject }
Q: 版本1中使用JSONObject直接 pase,现在需要使用JSON进行pase 导致Spring的封装出现问题,这要怎么解啊
原提问者GitHub用户xiaobaibi
问题出在Spring的封装上,Spring默认使用Jackson库进行JSON解析,而不是FastJSON库。因此,当使用FastJSON库的JSONObject对象作为请求参数时,Spring会将其解析为LinkedHashMap对象,而不是FastJSON的JSONObject对象,导致类型转换错误。
解决方法有两种:
修改Spring的JSON解析器为FastJSON库:可以通过在Spring配置文件中添加以下配置,将Spring的JSON解析器修改为FastJSON库: mvc:annotation-driven mvc:message-converters application/json;charset=UTF-8 </mvc:message-converters> </mvc:annotation-driven> xml 这样配置后,Spring就会使用FastJSON库进行JSON解析,可以正常解析FastJSON的JSONObject对象了。
将请求参数改为Java对象:将请求参数改为Java对象,而不是使用FastJSON的JSONObject对象,这样就不会出现类型转换错误了。例如,可以定义一个Java对象来表示请求参数: public class User { private String name; private int age; private Map<String, String> xxx; // getter and setter } java 然后在Controller中接收请求参数:
public JSONObject weChatPayResponseV3(@RequestBody User user) { Map<String, String> xxx = user.getXxx(); // do something } java 这样就可以正常接收请求参数了。
问题已经修复,请用新版本 https://github.com/alibaba/fastjson2/releases/tag/2.0.4
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。