我正在尝试在春季启动项目中阅读json。
我的JSON数据如下:
[{
"userId":"101"
},
{
"partNum":"aaa"
},
{
"partNum":"bbb"
},
{
"partNum":"ccc"
}]
我创建了一个DTO类:
public class TcPartDto {
private String userId;
private List<String> partNum;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public List<String> getPartNum() {
return partNum;
}
}
我在控制器中调用它如下:
@RequestMapping(value = "/volumeinfo", method = RequestMethod.POST, consumes = {"application/json"}, produces = {"application/json"})
@ResponseBody
public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto partList) throws Exception {
return tcService.fetchVolumeInfo(partList);
}
但是我收到以下错误:
通过邮递员我收到此错误:
“无法读取文档:无法反序列化实例 tc.service.model.TcPartDto出自START_ARRAY令牌\ n在[来源: java.io.PushbackInputStream@5359141a; line:1,column:1];嵌套 异常是com.fasterxml.jackson.databind.JsonMappingException:可以 不反序列化tc.service.model.TcPartDto的实例 START_ARRAY令牌\ n在[来源:java.io.PushbackInputStream@5359141a; line:1,column:1]“
我做错了什么?
答案 0 :(得分:0)
您正在向public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto partList)
方法发送JSON数组。但它应该反序列化为单个对象:TcPartDto partList
。
将您的JSON结构更改为仅发送一个TcPartDto
,或确保您的volumeinfo
方法可以收到Array
或List
。
如果要发送单个对象,则必须更改JSON结构:
{
"userId": 101,
"partNum": [
"aaa",
"bbb",
"ccc"
]
}
答案 1 :(得分:0)
您创建的DTO与其尝试阅读的json数据不匹配。
基于你的DTO样本,json应该是:
{
"userId" : "someId",
"partNum" : [ "partNum1", "partNum2"]
}
否则,如果您正在消费的json对象被修复,那么DTO应该是:
public class MyDTO {
private String userId;
private String partNum;
// ...
}
并且控制器的参数类型为
List<MyDTO>
答案 2 :(得分:0)
其他人已经指出了各种答案。
如果这是您要映射的json而不更改类:
JSON:
[{
"userId":"101"
},
{
"partNum":"aaa"
},
{
"partNum":"bbb"
},
{
"partNum":"ccc"
}]
班级:
@JsonIgnoreProperties(ignoreUnknown=true)
public class TcPartDto {
private String userId;
private List<String> partNum;
//getters and setters
}
控制器:
@RequestMapping(value = "/volumeinfo", method = RequestMethod.POST, consumes = {"application/json"}, produces = {"application/json"})
@ResponseBody
public List<TcPartVolumeDto> volumeinfo(@RequestBody TcPartDto[] partArray) throws Exception {
return tcService.fetchVolumeInfo(partArray);
}
输出:
[{"userId":"101","partNum":null},{"userId":null,"partNum":["aaa"]},{"userId":null,"partNum":["bbb"]},{"userId":null,"partNum":["ccc"]}]