无法使用Jackson ObjectMapper将Json序列化为Java对象

问题描述 投票:0回答:1

我正在编写一个Java spring boot mvc应用程序,可以进行数据导出/导入。我编写了一个包装类,它可以为Student类序列化/反序列化数据。它适用于导出,但在导入期间会出现错误

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>

我使用包装器类响应学生列表,

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上的MismatchInputException(stream,typeReference)

ObjectMapper应该返回一个带有学生列表的Response,但它没有......

@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中的原因...

json jackson objectmapper
1个回答
0
投票

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

mapper.writer().withDefaultPrettyPrinter().withRootName("import")
© www.soinside.com 2019 - 2024. All rights reserved.