这不是你想象中的:Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

大概意思就是说类型转换有问题,前端传来的数据不能转换成我接收的格式.

我第一时间先检查自己的接口,也对比了其他人的类似的接口,一样的写法,奇了怪?

 @ApiOperation(value = "保存", httpMethod = "POST")
    @RequestMapping(value ="/save",method = RequestMethod.POST)
    @ResponseBody
    public Result<String> saveTarget(
            @ApiParam("保存") @RequestBody List<TestDTO> testDTOS) {
       
        xxxService.save(testDTOS);
        return buildSuccessResult("保存成功", null);

    }

我 debug 看看,好吧,在入参的时候就报错了, swagger 接口调试莫名其妙多了一对双引号?

没办法,得面向 Goolge 编程了,搜索到这篇博客,这位老大哥说:

我又找前端相互排除格式问题,无果,想不通,为什么别人得接口可以而我的不行?

 

折腾了一整上午,只好求助大佬

最后大佬用 IDEA 带的 RestfulClient 帮我排除了,我的接口时没问题的,初步推测 swagger 版本的问题

 

然而事情还没有结束,前端说我都是按着 json 格式传你的,你看别的接口也是这样,又扯皮了几个小时,转而去求助另一个大佬.

他看 swagger 转换格式老是有问题,于是就用 Windows 自带的命令提示符操作

把上述的 Curl 复制粘贴文本编辑器调整一下格式

curl -X POST --header "Content-Type: application/json"  --header "Cookie: tracknick=admin; Souche-Security-Token=ZZZ1568006A_493c3f9589b3195316c7b419c252f4f2; _security_token=ZZZ1568006A_493c3f9589b3195316c7b419c123f4f2" --header "Accept: application/json" -d [{}] "http://local.xxx:8086/xxxAction/save"

 

再复制到 命名窗口,有意思的事情发生了,没有报错误!!!

问题进一步锁定,是前端传多了一个 body!

body:[{
    "age": 18,
    "sex": 0,
    "updatorId": "string"
  }]

 

正常前端传过来的格式是这样的:

[{
    "age": 18,
    "sex": 0,
    "updatorId": "string"
  }]

 

害,多了一个 body 在开头,真系日了狗,折腾了我两天.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误是因为在JSON解析过程,代码试图将一个对象转换为一个ArrayList,但是JSON的标记却是一个对象的开始标记,而不是一个数组的开始标记。这意味着代码无法将JSON数据转换为ArrayList对象。需要检查JSON数据格式是否正确,以确保代码可以正确解析它。 ### 回答2: 这个错误信息是在使用Java的JSON解析库时出现的,通常是因为代码尝试将一个JSON对象转换成JavaArrayList对象时出现了问题。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前端与后端数据处理。而Java有很多支持JSON的解析库,其很常用的是Jackson。当我们使用解析库将JSON格式的数据转换为Java对象时,如果JSON数据格式有误,就会出现这种类型的错误。 在这个错误信息,表示JSON解析器无法将JSON对象序列化成JavaArrayList对象。通常情况下,ArrayList是一个不定长的容器,而JSON的对象是由键值对组成的,所以在转换过程就会产生类型不匹配的错误。 解决这个问题有几种方法。首先,我们可以检查JSON数据是否符合要求。如果不符合JSON规范,解析器就无法将它解析成Java对象。我们还可以尝试将JSON数据格式调整为Java对应的List或ArrayList对象,或者使用Jackson的ObjectMapper将JSON数据转换为Java对象。 总之,当出现上述错误信息时,我们需要仔细分析JSON数据格式和Java对象类型的匹配程度,通过适当的调整来解决这个问题。 ### 回答3: 这个错误是由于尝试将JSON对象转换为ArrayList类型时出现了问题。在Java,反序列化JSON字符串通常涉及将JSON数据转换为Java对象。如果JSON字符串是一个数组,那么可以将其转换为Java ArrayList对象。然而,如果JSON字符串是一个对象(以“{”开头),而不是一个数组(以“[”开头),那么在尝试将JSON对象转换为ArrayList时就会出现这个错误。 这个错误的解决方法很简单。首先,确保传递给JSON解析器的字符串是符合要求的。如果传递的是数组,确保它以“[”开头和以“]”结尾。如果传递的是对象,确保它以“{”开头和以“}”结尾。 其次,检查Java代码的反序列化器的类型声明是否与JSON对象的类型声明匹配。如果JSON对象是一个对象而不是一个数组,那么声明的Java类型也应该是一个对象类型,而不是一个ArrayList类型。 最后,确保传递给反序列化器的JSON字符串已经过正确的格式化,并且字段名和类型声明正确。如果有问题会导致无法正确地反序列化JSON字符串到Java对象,这也会导致抛出此异常。 综上所述,要解决这个问题,需要确保传递给JSON解析器的字符串符合要求并且Java代码的反序列化器与JSON对象的类型声明匹配。此外,应该确保JSON字符串已经过正确的格式化并具有正确的字段名和类型声明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值