当前位置: 首页 > 知识库问答 >
问题:

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

赵华彩
2023-03-14

我正在编写一个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>
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 "";
}
{
  "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应该返回一个包含学生列表的响应,但它没有...

我设法找到了错误的原因。在Object->Json序列化过程中,缺少jackson根名...我手动添加

{
    **"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个答案

左丘耀
2023-03-14

问题是由于没有根级别的Java Object->Json序列化造成的。为了将它添加到Json,我刚刚通过withRootName()方法在mapper中添加了它,从现在开始,一切都运行良好!

mapper.writer().withDefaultPrettyPrinter().withRootName("import")
 类似资料:
  • 问题内容: 如何在JavaScript中将对象序列化为JSON? 问题答案: 您正在寻找。

  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 我正在尝试将我的代码 Json 数组中的这个 元素反序列化为自定义类..但我不能: 这是类: 但是我收到此错误: com.fasterxml.jackson.databind.exc.MismatchedInputException: START_ARRAY无法从 [Source: UNKNOWN; line: -1, column: -1] at com.fasterxml.jackson.da

  • 问题内容: 因此,当我偶然发现新的JsonSerializable Interface 时,我在php.net上四处徘徊,以获取有关将PHP对象序列化为JSON的信息。它只是 PHP > = 5.4,而我正在5.3.x环境中运行。 PHP <5.4如何实现这种功能? 我还没有使用JSON进行很多工作,但是我试图在应用程序中支持API层,并且将数据对象( 否则将发送到视图 )转储到JSON中将是完美

  • 问题内容: 我有由第三方编码为固定长度数组的json’ed 元组数组: 我想使用json魔术来获取的实例列表 请帮助我放置适当的注释,以使ObjectMapper发挥作用。 我无法控制传入的格式,而我所有的google’n都以答案来回答如何将适当的json对象(而非数组)数组映射到对象列表 问题答案: 添加以下注释: 并且它应该根据需要序列化条目。 另外:然后使用它来强制执行特定顺序是最安全的,因

  • 问题内容: 我想知道如何让Jackson JSON库将JSON反序列化为现有对象?我试图找到如何做到这一点。但它似乎只能接受一个Class并实例化它本身。 或者,如果不可能,我想知道是否有任何Java JSON反序列化库都可以做到。 对于C#,这似乎是一个相应的问题:将数据从JSON字符串覆盖到现有对象实例。似乎JSON.NET具有PopulateObject(string,object)。 问题