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

#java #jackson #lombok #rest-assured

#java #джексон #ломбок #будьте уверены

Вопрос:

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

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

Восстановленный контроллер, выполняющий post-запрос к API:

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

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

 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. 
}
 

Ответ Json:

 "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"
    ],
    ...
 

Сообщение об ошибке Complite:

 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"])
 

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

Комментарии:

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

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

3. data поле в вашем json не является ArayList , оно выглядит как Map<String,List<String>> .

Ответ №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;
}