首页 > 解决方案 > 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.ArrayListout of START_OBJECT token; 嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法java.util.ArrayList在 [Source: (PushbackInputStream); 处反序列化超出 START_OBJECT 令牌的实例;行:1,列:1]]

如何编码我的控制器后端?请帮忙。谢谢。

标签: javajsonspring

解决方案


您发送的内容与控制器的预期内容之间存在脱节。一旦你注意到断开连接,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 信息或该对象结构中的其他信息,那么您需要按照本杰明在先前答案中的建议创建更大的/包装器对象,并继续发送。


推荐阅读