Не удается десериализовать экземпляр `java.util.ArrayList<java.lang.Object>` из токена START_OBJECT

Не удается десериализовать Json в коллекцию List. Я использую Lombok, который содержит переменные поля:

@Data
@Builder
@EqualsAndHashCode(exclude = "success")
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class AparsersResponceDto {
  private Integer success;
  private ArrayList<String> data;
}

Контроллер RestAssured, который отправляет запрос в API:

public ValidatableResponse getFirstAparserStatus(AparsersDto toGetAparser) {
    return RestAssured
            .given().spec(getDefaultRequestSpecification())
            .body(toGetAparser)
            .when()
            .post(apars141 + port1)
            .then()
            .log().all();
}

И извлеките тело почтового запроса:

private AparsersController aparsersController = new AparsersController();


public AparsersResponceDto postFirstBody(AparsersDto aparsersDto) {
    return aparsersController
            .getFirstAparserStatus(aparsersDto) //Sent post request with the body aparsersDto through RestAssured
            .statusCode(200)
            .extract().body().as(AparsersResponceDto.class); // Here i can't make extract of the 'data' field due to collection List. 
}

Ответ Джейсон:

"success": 1,
"data": {
    "45.90.34.87:59219": [
        "http"
    ],
    "144.76.108.82:41049": [
        "http"
    ],
    "5.9.72.48:59473": [
        "http"
    ],
    "130.0.232.208:49327": [
        "http"
    ],
    "217.172.179.54:39492": [
        "http"
    ],
    ...

Полное сообщение об ошибке:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<java.lang.Object>` out of START_OBJECT token at [Source: (StringReader); line: 1, column: 21] (through reference chain: com.rest.dto.AparsersResponceDto["data"])

Как я могу это исправить?

Сообщение об ошибке и ваш класс не совпадают. Состояние ошибки ArrayList<StringBuilder>, но в вашем классе нет членов с типом ArrayList<StringBuilder>. Выложенный код является полным кодом.

seenukarthi 16.12.2020 11:03

@KarthikeyanVaithilingam Извините, невнимательно скопировано. Уже исправлено и добавлена ​​дополнительная информация.

Илья Шилков 16.12.2020 11:21
data поле в вашем json не является ArayList, оно выглядит как Map<String,List<String>>.
seenukarthi 16.12.2020 11:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
16 146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

data в JSON — это не ArrayList<String>, а Map<String,List<String>>

Поэтому измените DTO следующим образом.

@Data
@Builder
@EqualsAndHashCode(exclude = "success")
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class AparsersResponceDto {
   private Integer success;
   private Map<String,List<String>> data;
}

Другие вопросы по теме