java - Java Spring POST 与数组和对象 JSON 数据问题
问题描述
我通过 POST ajax 从前端发送这个:
它由 JSON 数组和对象组成。
编辑:我已经设置:
contentType: 'application/json'
确切的 JSON 发送如下:
{
"alertKeeperDTOs": [
{
"isSelected": true,
"rn": 0,
"keeperId": "B116453993D52735E0530A10CA0A9D27",
"keeperName": "myName"
},
{
"isSelected": false,
"rn": 1,
"keeperId": "65EE22D4A55C4437A4F5552CBFD8D6D0",
"keeperName": "test",
}
],
"deviceId": 4
}
我试图从控制器那里得到这个:(已编辑)
public @ResponseBody String updateDeviceToKeeperList(@RequestBody List<AlertKeeperDTO> alertKeeperDTOs,
@RequestBody Long deviceId, HttpServletRequest request){
....
}
但我收到一个错误(HTTP 400):
已解决 [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of
java.util.ArrayList
out of START_OBJECT token; 嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法java.util.ArrayList
在 [Source: (PushbackInputStream); 处反序列化超出 START_OBJECT 令牌的实例;行:1,列:1]]
如何编码我的控制器后端?请帮忙。谢谢。
解决方案
您发送的内容与控制器的预期内容之间存在脱节。一旦你注意到断开连接,JSON 消息在其令人困惑的措辞中实际上非常准确地表达了它。
您发送的是一个包含两个键的 OBJECT,其中一个是事物列表。
{
"alertKeeperDTOs": [ ..list of things.. ],
"deviceId": ...
}
您的控制器所期望的只是事物列表
List<AlertKeeperDTO> alertKeeperDTOs
这会导致错误Cannot deserialize instance of java.util.ArrayList out of START_OBJECT token
,因为您开始的 OBJECT 不是 LIST!
因此,您需要决定此时要做什么。您要发送对象还是列表?如果您只想发送 LIST,请将您发送的内容更改为数组内容。所以你会发送:
[
{
"isSelected": true,
"rn": 0,
"keeperId": "B116453993D52735E0530A10CA0A9D27",
"keeperName": "myName"
},
{
"isSelected": false,
"rn": 1,
"keeperId": "65EE22D4A55C4437A4F5552CBFD8D6D0",
"keeperName": "test",
}
]
但是,如果您也需要发送 deviceId 信息或该对象结构中的其他信息,那么您需要按照本杰明在先前答案中的建议创建更大的/包装器对象,并继续发送。
推荐阅读
- java - 我的数据库引用未显示在树中
- c++ - 非 void 函数上的 C++ 崩溃没有返回语句
- python - 使用 python3.6 和 python3.7 在异步中使用 wait_for 的套接字泄漏
- salesforce - 修改代码以允许特定帐户的差异
- vba - 如何使用vba在大型机中查找文本是否突出显示
- java - maven安装时出现编译错误我该如何解决这个错误
- c++ - 列表的 C++ 重载 [][]
- authentication - 如何配置 IBM MQ v9 以使用 Microsoft AD 进行用户认证
- c# - 如何在c#中读取列表中多个csv文件的内容
- sql - 当数据字段组合与相同和不同列匹配时选择记录