com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 0出现这种报错我的解决办法

本文详细介绍了如何解决在使用@RequestBody注解接收前端数据时遇到的问题,通过正确配置前端的JSON.stringify方法和设置contentType为application/json;utf-8,成功实现了前后端的数据交互。

近期想研究如何通过前端数据封装成对象传到后台,其他方式都通过了,但是希望后台用@RequestBody接收,总是出现如下图的报错:

网上百度了很多,可是大部分讲得比较高大上,也没能解决我的问题,于是我下定决心想把它解决掉。通过百度,也大概得到一个思路:要传JSON字符串、ajax要添加contentType:"application/json; utf-8"。顺着这个思路,果然跑通了。

我用的jackson相关依赖如下:

 <!--jackson相关包-->
  <!--https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core-->
<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-core</artifactId>
     <version>2.10.0</version>
</dependency>
<!--  https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations-->
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-annotations</artifactId>
     <version>2.10.0</version>
 </dependency>
<!--  https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind-->
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.10.0</version>
 </dependency>

1、既然要传JSON字符串,那么在前端,要把data数据转成字符串:JSON.stringify(param),下面是我测试的前端js代码(注意看我代码中的注解):

        /**
         * 后台用@RequestBody接收
         */
        function toRequestBody(){
            debugger
            var param = {};
            param.productId=1;
            param.productName="hahah";
            param.img="test.jsp";
            $.ajax({
                url:getRootPath()+"/test/getProductList_v2",
                //data:param, 这是我原来的代码,是一个Object对象
                data:JSON.stringify(param), //修改后的代码
                contentType:"application/json; utf-8",//添加的(经过测试,必须有)
                type:"post", //好像只能用post提交方式才行,get不行
                success:function (result) {
                    debugger;
                    console.log(result);
                }
            })
        }

2、在后台的代码如下


    /** @Description:
     * 用@RequestBody时,要在前端把该数据转成json格式,
     * 即转成JSON.stringify(param)传进来
     * @Author:wrb
     * @Date:2020/1/10/17:25
     * @Param 
     * @return com.baking.util.Msg
     */
    @RequestMapping(value = "/getProductList_v2",method=RequestMethod.POST,produces = "application/json; utf-8")
    @ResponseBody
    public Msg getProductList_v2(@RequestBody Product product){
        Msg msg = new Msg();
        List<Product> productList = productSerice.getProductList(product);
        msg.setCode("0");
        msg.setData(productList);
        return msg;
    }

或者下面的代码:

/** @Description: 或者下面这种方式
     * 用@RequestBody时,要在前端把该数据转成json格式,
     * 即转成JSON.stringify(param)传进来
     * @Author:wrb
     * @Date:2020/1/10/17:25
     * @Param
     * @return com.baking.util.Msg
     */
    @RequestMapping(value = "/getProductList_v3")
    @ResponseBody
    public Msg getProductList_v3(@RequestBody Product product){
        System.out.println("getProductList_v3==>"+"product");
        Msg msg = new Msg();
        List<Product> productList = productSerice.getProductList(product);
        msg.setCode("0");
        msg.setData(productList);
        return msg;
    }

3、测试结果分别如下:

解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值