SpringBoot后端接收含对象列表的JSON请求数据为空问题求助
问题分析与解决方案
你的问题源于两个核心问题:请求体数据类型与后端实体类不匹配,以及实体类的getter/setter命名与字段名不一致,导致Jackson无法正确完成JSON反序列化,最终dataFields列表为空。
1. 创建匹配请求体的实体类
客户端发送的dataFields是对象列表(每个对象包含type、label、name、value等字段),但你后端用List<String>接收,类型完全不匹配。需要先定义对应的数据实体类:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; // 忽略JSON中不存在的字段,适配不同结构的对象 @JsonIgnoreProperties(ignoreUnknown = true) public class DataField { private String type; private String label; private String name; private String value; // 生成标准getter和setter方法 public String getType() { return type; } public void setType(String type) { this.type = type; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
2. 修改ManageRequest实体类
将dataFields的类型改为List<DataField>,同时修正getter/setter的命名(必须和字段名dataFields对应,否则Jackson无法识别):
import java.util.List; public class ManageRequest { private String accountId; private String command; private String transactionId; // 修改为List<DataField>类型 private List<DataField> dataFields; public String getAccountId() { return accountId; } public void setAccountId(String accountId) { this.accountId = accountId; } public String getCommand() { return command; } public void setCommand(String command) { this.command = command; } public String getTransactionId() { return transactionId; } public void setTransactionId(String transactionId) { this.transactionId = transactionId; } // 修正getter/setter名称,与字段名dataFields保持一致 public List<DataField> getDataFields() { return dataFields; } public void setDataFields(List<DataField> dataFields) { this.dataFields = dataFields; } }
3. 后端接口处理
现在接口可以正常接收dataFields列表,你可以提取内容进行后续处理:
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @PostMapping( consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE}, produces = {MediaType.APPLICATION_JSON_VALUE}) public void postBody(@RequestBody ManageRequest manageRequest) { List<DataField> dataFields = manageRequest.getDataFields(); // 示例1:直接复制原列表用于后续请求 List<DataField> newDataList = new ArrayList<>(dataFields); // 示例2:筛选特定类型的字段(比如图片类型) List<DataField> imageFields = dataFields.stream() .filter(field -> "_image_".equals(field.getType())) .collect(Collectors.toList()); // 后续POST请求逻辑... }
为什么之前为空?
- 类型不匹配:客户端发送的是对象数组,后端用
List<String>接收,Jackson无法将对象转换为字符串,反序列化失败导致列表为空。 - 命名不匹配:实体类字段名为
dataFields,但setter方法是setDataFieldList,Jackson找不到对应的注入方法,无法填充数据。
内容的提问来源于stack exchange,提问作者letsgetraw
相关产品推荐
相关产品推荐

