Элементами коллекций десериализованного объекта JSON являются LinkedHashMap. - PullRequest
0 голосов
/ 27 мая 2018

Я отправляю запрос контроллеру https://pastebin.com/d4SHZuZh. Десериализацию JSON с помощью Builder из этого класса.@JsonDeserialize(builder = ContributionNewRequest.Builder.class)

Элементами коллекции являются ? extends MovieInfoDTO объекты, наследуемые от MovieInfoDTO.

при получении элементов, например, из списка elementsToAdd

contribution.getElementsToAdd()
            .forEach(boxOffice -> {
                ...
            });

itОказывается, что элемент boxOffice является объектом java.util.LinkedHashMap.

В Интернете я обнаружил упоминание http://www.baeldung.com/jackson-collection-array, что JSON по умолчанию устанавливает элементы коллекции как LinkedHashMap.

Что мне нужно сделать, чтобы сделать объекты правильного типа?

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.jonki.popcorn.common.dto.movie.BoxOffice
at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_171]

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы должны настроить свой десериализованный конструктор.

Попробуйте что-то вроде этого

public class CustomDeserializer extends StdDeserializer<List<? extends MovieInfoDTO>> {
    protected CustomDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public List<? extends MovieInfoDTO> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        String json = jsonParser.getText();
        TypeReference type = new TypeReference<List<? extends MovieInfoDTO>>() {};
        return objectMapper.readValue(json, type);
    }
}

Наконец добавьте @JsonDeserialize(using = CustomDeserializer.class) перед вашим elementsToAdd свойством

Надеюсь, это поможетВы немного.

0 голосов
/ 28 мая 2018

Попробуйте преобразовать его, используя следующий код.

public <T> List<T> jsonToObjectList(String json, Class<T> tClass) throws IOException {
            ObjectMapper objectMapper = new ObjectMapper();
            List<T> ts = objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass));
            return ts;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...