java - 使用 Spring Boot 进行 Jackson 多态反序列化 JSON解析错误:对象条目内/之间的意外输入结束
问题描述
我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来序列化/反序列化实体。
下面是我正在做的代码
- 组织DTO.java
public class OrganizationDTO {
private long id;
private String name;
List<? extends EmployeeDTO> employees;
//getter and setter
}
- EmployeeDTO.java(父类)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = FullTimeEmployeeDTO.class, name = "full"),
@Type(value = PartTimeEmployeeDTO.class, name = "part")
})
public abstract class EmployeeDTO {
private long id;
private String name;
//getter and setter
}
- FullTimeEmployeeDTO.java(子类)
@JsonTypeName("full")
public class FullTimeEmployeeDTO extends EmployeeDTO {
private int salary;
//getter and setter
}
- PartTimeEmployeeDTO.java(子类)
@JsonTypeName("part")
public class PartTimeEmployeeDTO extends EmployeeDTO {
private int hourlyRate;
//getter and setter
}
- 组织控制器
@PostMapping
public ResponseEntity<ResponseUtil<Employee>> save(@RequestBody OrganizationDTO organization) {
organizationService.save(organization);
return new ResponseEntity<>(new ResponseUtil<Employee>("Data Saved Successfully."), HttpStatus.CREATED);
}
我正在尝试使用以下数据从邮递员那里调用此端点。
{
"name": "My Organization",
"employees": [
{
"type": "full",
"name": "Vinit Solanki",
"salary": 200
},
{
"type": "full",
"name": "Viren Shah",
"salary": 300
}
]
}
我得到了如下异常。
{
"timestamp": "2019-11-29T10:35:29.146+0000",
"status": 400,
"error": "Bad Request",
"message": "JSON parse error: Unexpected end-of-input within/between Object entries; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected end-of-input within/between Object entries\n at [Source: (PushbackInputStream); line: 10, column: 21] (through reference chain: com.example.demo.dto.OrganizationDTO[\"employees\"]->java.util.ArrayList[1])",
"path": "/organizations"
}
我想知道在尝试OrganizationDTO
通过readValue()
. 下面是一个例子。
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
OrganizationDTO orgDTO = mapper.readValue(
"{\n" +
" \"name\": \"My Organization\",\n" +
" \"employees\": [\n" +
" {\n" +
" \"type\": \"full\",\n" +
" \"name\": \"Vinit Solanki\",\n" +
" \"salary\": 200\n" +
" },\n" +
" {\n" +
" \"type\": \"full\",\n" +
" \"name\": \"Vinit Solanki\",\n" +
" \"salary\": 130\n" +
" }\n" +
" ]\n" +
"}",
OrganizationDTO.class);
}
有谁知道我为什么会收到这个错误?谢谢。
解决方案
推荐阅读
- ios - 将UTC日期转换为本地日期swift4
- android - 如何动态更改线性布局中静态创建的布局的顺序?(安卓工作室)
- sql - 在 Hana DB 中传输 4 个虚拟 SDA 表的最佳方式
- camel-cxf - Apache Camel 在调用 CXF Endpoint 时返回 NullPointerException。将骆驼从 2.X 升级到 3.0 后失败
- android - 如何更新 Firebase 实时数据库中的现有值?
- python-3.x - ImportError: cannot import name 'number' from 'test' (E:\PL\Atom\RPS.py\test.py) 是什么意思?
- python-3.x - 将文件从 tgz 提取到 tar 和从 tar 到 txt Databricks Python3 Unix/Linux
- python - 在 Pandas 中使用 Lambda 函数时,Str 对象没有属性“键”
- fortran - 线性格的状态密度的 Fortran 编码
- php - tr 标签迭代 10 次后生成新表