首页 > 解决方案 > com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_ARRAY 令牌中反序列化“Todo”实例

问题描述

我有这个 json,我将它转换为 POJO

JSON 转换为 POJO 文件

[
    {
        "postId": 81,
        "id": 401,
        "name": "cum voluptate sint voluptas veritatis",
        "email": "Vella.Mayer@colten.net",
        "body": "sit delectus recusandae qui\net cupiditate sed ipsum culpa et fugiat ab\nillo dignissimos quo est repellat dolorum neque\nvoluptates sed sapiente ab aut rerum enim sint voluptatum"
    },
    {
        "postId": 81,
        "id": 403,
        "name": "cum voluptate sint voluptas veritatis",
        "email": "Vella.Mayer@colten.net",
        "body": "sit delectus recusandae qui\net cupiditate sed ipsum culpa et fugiat ab\nillo dignissimos quo est repellat dolorum neque\nvoluptates sed sapiente ab aut rerum enim sint voluptatum"
    }
]

这是我将它转换成的 POJO 类

public class TodoItem{
    private int id;
    private boolean completed;
    private String title;
    private int userId;

我尝试使用 todo 来验证它的类类型的响应,但总是得到这个错误。

Todo todo = response.getBody().as(Todo.class);
Assert.assertTrue(response.statusCode() == 200);

错误

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `io.christdoes.pojo.todo.Todo` out of START_ARRAY token
 at [Source: (String)"[

标签: json-deserializationrest-assuredpojo

解决方案


你做错了两件事:

  • 您正在匹配的 POJO
  • 映射方式(数组无法映射到单个对象)

这将是

List<TodoItem> todoItems = response.as(new TypeRef<>() {});

POJO(我使用 lombok 生成 getter/setter)

import lombok.Data;

@Data
public class TodoItem{
    private int postId;
    private int id;
    private String name;
    private String email;
    private String body;
}

推荐阅读