Невозможно десериализовать экземпляр <DataModel>из токена START_OBJECT - PullRequest
0 голосов
/ 22 января 2020

У меня проблема с Спрингом и Джексоном. Я пытался получить входные данные от этого API . Я создал Java модель, используя http://www.jsonschema2pojo.org/

Модель


package io.github.mat3e.earthquake.jsonObject;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.util.List;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "type",
    "metadata",
    "features",
    "bbox"
})
public class DataModel {

    @JsonProperty("type")
    private String type;
    @JsonProperty("metadata")
    private Metadata metadata;
    @JsonProperty("features")
    private List<Feature> features = null;
    @JsonProperty("bbox")
    private List<Double> bbox = null;

    @JsonProperty("type")
    public String getType() {
        return type;
    }

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

    @JsonProperty("metadata")
    public Metadata getMetadata() {
        return metadata;
    }

    @JsonProperty("metadata")
    public void setMetadata(Metadata metadata) {
        this.metadata = metadata;
    }

    @JsonProperty("features")
    public List<Feature> getFeatures() {
        return features;
    }

    @JsonProperty("features")
    public void setFeatures(List<Feature> features) {
        this.features = features;
    }

    @JsonProperty("bbox")
    public List<Double> getBbox() {
        return bbox;
    }

    @JsonProperty("bbox")
    public void setBbox(List<Double> bbox) {
        this.bbox = bbox;
    }

}

Конечно, все зависимости (подклассы добавляются в одной и той же структуре).

Код для извлечения данных из внешнего API:

@GetMapping("/3")
    public String getCostam() {
        RestTemplate rest = new RestTemplate();

        ResponseEntity<DataModel[]> responseEntity = restTemplate.getForEntity(url2, DataModel[].class);
        Object[] objects = responseEntity.getBody();
        MediaType contentType = responseEntity.getHeaders().getContentType();
        HttpStatus statusCode = responseEntity.getStatusCode();
        return statusCode.toString();

    }

Когда я запускаю код и пытаюсь получить адрес "api / 3", возникает следующая ошибка:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `[Lio.github.DataModel;` out of START_OBJECT token
 at [Source: (PushbackInputStream); line: 1, column: 1]

1 Ответ

0 голосов
/ 22 января 2020

Спасибо @Willem и @mkarasik за вашу помощь:

Я внес следующие изменения в код

@GetMapping("/3")
    public String getCostam() {
        RestTemplate rest = new RestTemplate();

        ResponseEntity<DataModel> responseEntity = restTemplate.getForEntity(url2, DataModel.class);

        MediaType contentType = responseEntity.getHeaders().getContentType();
        HttpStatus statusCode = responseEntity.getStatusCode();

        System.out.println(responseEntity
                .getBody().getFeatures());



        return statusCode.toString();

    }

Чтобы получить массив мест, где произошло землетрясение, я просто использовал метод ovverided в Feature класс

 @Override
    public String toString() {
        return properties.getPlace();
    }

Спасибо, ребята, за помощь. Я получил то, что мне было нужно.

Теперь я хочу отобразить параметры из FrontEnd, чтобы предоставить их моему бэкэнду вместо жестко закодированной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...