com.fasterxml.jackson.databind.exc.Исключение MismatchedInputException: Не удается десериализовать экземпляр «Todo» из маркера START_ARRAY

#json-deserialization #rest-assured #pojo

Вопрос:

У меня есть этот json, который я преобразовал в POJO

Файл JSON преобразован в файл POJO

 [
    {
        "postId": 81,
        "id": 401,
        "name": "cum voluptate sint voluptas veritatis",
        "email": "Vella.Mayer@colten.net",
        "body": "sit delectus recusandae quinet cupiditate sed ipsum culpa et fugiat abnillo dignissimos quo est repellat dolorum nequenvoluptates 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 quinet cupiditate sed ipsum culpa et fugiat abnillo dignissimos quo est repellat dolorum nequenvoluptates 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)"[
 

Ответ №1:

Есть 2 вещи, которые вы сделали неправильно:

  • POJO, которому ты соответствуешь
  • Способ отображения (массив не может быть сопоставлен с одним объектом)

Это было бы

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

POJO (я использую ломбок для генерации геттеров/сеттеров)

 import lombok.Data;

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