Norwich
@Norwich
Web-developer

Преобразовать из Json в Java обьект?

Сейчас совершенно тупой вопрос, над которым я в 3 часа ночи ломаю голову
Есть POST запрос из Spring клиента к внешнему API
ResponseEntity<Dev> result = restTemplate.exchange(HELLO_URL, HttpMethod.POST, new HttpEntity<>(headers), Dev.class);

И тем самым я получаю Json следующего вида
[
    {
        "id": xxxx,
        "name": "xxxx",
        "identifier": "xxxx",
        "type": "xxxxx",
        "time_zone": "GMT+3:00",
        "is_favourite": false,
        "categories": [
            xxxx
        ],
        "last_dt": "xxxx",
        "lastOperative_dt": xxx,
        "lastConfiguration_dt": "xx",
        "lastManageable_dt": "xxx",
        "is_online": true,
        "has_alarm": false,
        "has_unread": false,
        "status": "online"
    }
]


Классы Dev и Device следующие:
public class Dev {
    private ArrayList<Device> device;

    public List<Device> getDevice() {
        return device;
    }

    public void setDevice(ArrayList<Device> device) {
        this.device = device;
    }
}


@JsonIgnoreProperties(ignoreUnknown = true)
public class Device {
    private Long Id;
    private String name;
    private String identifier;
    private String type;

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIdentifier() {
        return identifier;
    }

    public void setIdentifier(String identifier) {
        this.identifier = identifier;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}


Но при выполнении запроса получаю ошибку:
org.springframework.web.client.RestClientException: Error while extracting response for type [class com.javainuse.model.Dev] and content type [application/json;charset=UTF-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.javainuse.model.Dev` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.javainuse.model.Dev` out of START_ARRAY token
 at [Source: (PushbackInputStream); line: 1, column: 1]


Очень прошу помощи
Заранее спасибо
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
@g33km
В ответе на вызов HTTP-метода возвращается не единичный JSON-объект {}, а [массив объектов]. Вы же в своём коде пытаетесь десериализовать массив объектов в единичный объект класса Dev, из-за чего и происходит выбрасывание ошибки. Необходимо при вызове restTemplate.exchange указать, что ответ на вызов метода должен быть десериализован в массив или список. Однако, делается это с помощью небольшого трюка с
org.springframework.core.ParameterizedTypeReference
классом:
ResponseEntity<List<Dev>> result = restTemplate.exchange(
                HELLO_URL,
                HttpMethod.POST,
                new HttpEntity<>(headers),
                new ParameterizedTypeReference<List<Dev>>() {}
        );


Подробное описание решения можно найти здесь
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
Senior Junior Roo
У вас на входе не класс Dev, а массив/список Device
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы