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

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

下面简单描述下

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

记录一次JSONObject导致迷茫的问题_测试数据

接口和数据如下

记录一次JSONObject导致迷茫的问题_测试数据_02

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

开始调用接口测试

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

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

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

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

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

确定最终原因:在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();
}

我是纪先生,用输出倒逼输入而持续学习,持续分享技术系列文章,以及全网值得收藏好文,欢迎关