likes
comments
collection
share

记录一次JSONObject导致迷茫的问题

作者站长头像
站长
· 阅读数 20

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

很简单的一个接口,写的时候很自信。都不带测试的,直接部署让前端使用,结果打脸了,而且还是一脸懵逼的错误。

哪怕你是老油条,开发的接口再简单也要自己测试一下 再交给前端或者测试,不然容易打脸,挺疼的

下面简单描述下

以前的接口都是使用对象或者单字段接受参数,这次接口比较单一,懒得建对象了,就直接使用JSONObject接收了,上代码

记录一次JSONObject导致迷茫的问题

接口和数据如下

记录一次JSONObject导致迷茫的问题

接口和数据都很正常 ,完全没有问题。

开始调用接口测试

记录一次JSONObject导致迷茫的问题

记录一次JSONObject导致迷茫的问题

什么情况啊,在41行出现强转失败的错误,只是把Object对象转成JSONObject,但是我代码里都没有LinkedHashMap,为什么会有这种错误呢。

打印下他的类型发现就是LinkedHashMap

记录一次JSONObject导致迷茫的问题

确定最终原因:在controller中使用JSONObject接收数据的时候会把集合解析成LinkedHashMap

所以不能使用JSONObject强转,否则就会出现类型转换的错误,一般我们都是使用具体的对象接收参数,遇不到这种问题。

解决问题:

  1. 可以使用String接收,然后再转成JSONObject
    @ApiOperation("测试数据")
    @PostMapping
    public static ResponseEntity insertData(@RequestBody String data){
        JSONArray jsonArray =  JSONObject.parseObject(data).getJSONArray("body");
        for (Object object :jsonArray){
            JSONObject jsonObject = (JSONObject)object;
        }
        return Results.success();
    }
  1. 使用JSON.toJSON
    @ApiOperation("测试数据")
    @PostMapping
    public static ResponseEntity insertData(@RequestBody JSONObject data){
        JSONArray jsonArray =  data.getJSONArray("body");
        for (Object object :jsonArray){
            JSONObject jsonObject = (JSONObject)JSON.toJSON(object);
        }
        return Results.success();
    }
  1. 使用ObjectMapper
    @ApiOperation("测试数据")
    @PostMapping
    public static ResponseEntity insertData(@RequestBody JSONObject data){
        ObjectMapper objectMapper = new ObjectMapper();
        JSONArray jsonArray =  data.getJSONArray("body");
        for (Object object :jsonArray){
            JSONObject jsonObject1 =  objectMapper.convertValue(data,JSONObject.class);
        }
        return Results.success();
    }

我是纪先生,用输出倒逼输入而持续学习,持续分享技术系列文章,以及全网值得收藏好文,欢迎关注公众号,做一个持续成长的技术人。

个人主页:www.ajisun.fun/