无法使用杰克逊ObjectMapper将Json序列化为Java对象

时间:2019-03-31 18:27:09

标签: json jackson objectmapper

我正在编写一个Java Spring Boot MVC应用程序,可以导出/导入数据。我写了一个包装器类,应该对学生类的数据进行序列化/反序列化。它对导出很有效,但是在导入过程中会出现错误

com.fasterxml.jackson.databind.exc.MismatchedInputException: Root name 
'student' does not match expected ('students') for type [simple type, 
class org.bajiepka.courseApp.wrappers.Response] at [Source: 
(FileInputStream); line: 2, column: 3]

这是我的maven jackson依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

我使用包装器类的Response作为学生列表,

package org.bajiepka.courseApp.wrappers;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;
import org.bajiepka.courseApp.domain.Student;

@JsonRootName("import")
public class Response {

    private Iterable<Student> students;

    @JsonProperty("students")
    public Iterable<Student> getStudents(){
        return students;
    }

    public void setStudents(Iterable<Student> students) {
         this.students = students;
    }
}

这是我的学生班:

@Data
@Entity
public class Student {

    private @Id @GeneratedValue Long id;
    private @Version int version;
    @NotNull
    private String name;
    private String address;
    private String phone;    
    private Integer gradeBook;
    private float averageProgress;

    public Student() {}
    }
}

这是创建导出文件的方法:

public String write(boolean toFile){

    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    ObjectWriter writer = mapper.writer().withDefaultPrettyPrinter();

    try {
        String result = writer.writeValueAsString(response);
        if (toFile){
            result = fileService.writeToFile(result);
        }

        return result;
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return "";
}

导出后,我得到了带有json的文件,我无法将其转换为java对象:

{
  "student" : [ {
    "id" : 1,
    "version" : 0,
    "name" : "Rachel Jessica Parker",
    "address" : "Pentaho",
    "phone" : "111-22-33",
    "gradeBook" : 1000121,
    "averageProgress" : 0.0
  }, {
    "id" : 2,
    "version" : 0,
    "name" : "Bobby Jackson Junior",
    "address" : "Illinois",
    "phone" : "222-33-44",
    "gradeBook" : 1000122,
    "averageProgress" : 0.0
  }, {
    "id" : 3,
    "version" : 0,
    "name" : "Sammy Smith Carlson",
    "address" : "Pennsylvania",
    "phone" : "333-44-55",
    "gradeBook" : 1000123,
    "averageProgress" : 0.0
  }, {
    "id" : 4,
    "version" : 0,
    "name" : "Harry Dale Harrison",
    "address" : "Detroit",
    "phone" : "444-55-66",
    "gradeBook" : 1000124,
    "averageProgress" : 0.0
  }, {
    "id" : 5,
    "version" : 0,
    "name" : "Lindsey jefferson Conly",
    "address" : "Washington",
    "phone" : "555-66-77",
    "gradeBook" : 1000125,
    "averageProgress" : 0.0
  }, {
    "id" : 6,
    "version" : 0,
    "name" : "Mo Williams Jr.",
    "address" : "New York",
    "phone" : "666-77-88",
    "gradeBook" : 1000126,
    "averageProgress" : 0.0
  } ]
}

最后这是转换方法:

@GetMapping(value = "/import")
public String importFile(@RequestParam Long id){

    File importFile = new File(exchangeFileService.findById(id).getName());
    if (importFile.exists()) {
        try (FileInputStream stream = new FileInputStream(importFile)) {

            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
            TypeReference<Response> typeReference = new TypeReference<>(){};
            Response response = mapper.readValue(stream, typeReference);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return "redirect:/exchange/upload";
}

我在mapper.readValue(stream,typeReference)上面提到了MismatchInputException

ObjectMapper应该给我一个包含学生列表的响应,但是没有...

@UPDATE

我设法找到了错误的原因。 在对象-> Json序列化杰克逊根名丢失期间... 我已手动添加

{
    **"import" : {**
        "student" : [ {
            "id" : 1,
            "version" : 0,
            "name" : "Rachel Jessica Parker",
            "address" : "Pentaho",
            "phone" : "111-22-33",
            "gradeBook" : 1000121,
            "averageProgress" : 0.0
  }, ... ]
        ,
        "course" : [ {
            "id" : 7,
            "version" : 0,
            "name" : "Physics for 9-th grade",
            "number" : 100292910,
            "cost" : 25000.0,
            "modules" : 0,
            "max_COURSES_PER_STUDENT" : 3,
            "modules_PER_COURSE" : 10
          }, ... ]
    **}**
}

我还设法扩展了Response类,这是必需的...现在,我试图在序列化过程中在ObjectMapper中查找原因...

1 个答案:

答案 0 :(得分:0)

问题是由于Java对象->没有根级别的Json序列化引起的。 要将其添加到Json中,我刚刚通过withRootName()方法将其添加到了mapper上,并且从现在开始一切正常!

mapper.writer().withDefaultPrettyPrinter().withRootName("import")