开发者社区> 问答> 正文

Controller 接口使用 @RequestBody JSONObject requestBod

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

展开
收起
大圣东游 2023-04-21 12:07:45 283 0
2 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    问题出在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 这样就可以正常接收请求参数了。

    2023-04-21 21:10:26
    赞同 展开评论 打赏
  • 问题已经修复,请用新版本 https://github.com/alibaba/fastjson2/releases/tag/2.0.4

    原回答者GitHub用户wenshao

    2023-04-21 15:01:00
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载