首页 > 解决方案 > 使用 Spring Boot 进行 Jackson 多态反序列化 JSON解析错误:对象条目内/之间的意外输入结束

问题描述

我正在使用 @JsonTypeInfo 和 @JsonSubTypes 来序列化/反序列化实体。

下面是我正在做的代码

  1. 组织DTO.java
public class OrganizationDTO {
    private long id;
    private String name;
    List<? extends EmployeeDTO> employees;
    //getter and setter
}
  1. 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
}
  1. FullTimeEmployeeDTO.java(子类)
@JsonTypeName("full")
public class FullTimeEmployeeDTO extends EmployeeDTO {
    private int salary;
    //getter and setter
}
  1. PartTimeEmployeeDTO.java(子类)
@JsonTypeName("part")
public class PartTimeEmployeeDTO extends EmployeeDTO {
    private int hourlyRate;
    //getter and setter
}
  1. 组织控制器
@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);

    }

有谁知道我为什么会收到这个错误?谢谢。

标签: javaspring-bootjacksonmarshallingjackson-databind

解决方案


推荐阅读