Подтвердить что ты не робот

Как преобразовать LinkedHashMap в пользовательский объект java?

Я пытаюсь получить данные из одного приложения в другое через RESTful WS, и он работает, но я не могу использовать эти данные, так как я не могу его отличить... WS возвращает список таких объектов:

{id=1, forename=John, surname=Bloggs, username=jbloggs, role=Graduate Developer, office=London, skills=[{technology=Java, experience=2.5}, {technology=Web, experience=2.0}, {technology=iOS, experience=0.0}, {technology=.NET, experience=0.0}]}

чтобы получить я использую Jackson ObjectMapper:

ObjectMapper mapper = new ObjectMapper();

    List<ConsultantDto> list = new ArrayList<ConsultantDto>();


    try {

        list = mapper.readValue(con.getInputStream(), ArrayList.class);

    } catch (JsonGenerationException e) {

        e.printStackTrace();

    } catch (JsonMappingException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    }

после этого у меня есть 3 строки кода:

System.out.println(list.get(0));
System.out.println(list.get(0).getForename());
return list;

потому что это возвращаемое значение метода передается другому веб-сервису, который отображает правильные данные в браузере. Интересная вещь случается с двумя линиями печати, один печатает данные из верхней части этого сообщения ({id: 1...}), а другой вызывает исключение:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xxx.xxx.web.dto.rp.ConsultantDto

ConsultantDto и SkillDto - это два законных класса, которые имеют все свойства, установленные для соответствия данным из WS, все геттеры/сеттеры находятся на своем месте. Насколько мне известно, LinkedHashMap хранит данные как пары "ключ: значение", поэтому я просто не вижу, откуда это исключение. Как я могу это исправить и почему ObjectMapper просто правильно разбирает значение (что он делает, когда я получаю только один консультант, а не список)?

4b9b3361

Ответ 1

Вам нужно сделать это:

List<ConsultantDto> myObjects =
    mapper.readValue(jsonInput, new TypeReference<List<ConsultantDto>>(){});

(Из этого SO ответ)

Причина, по которой вы должны использовать TypeReference, связана с неудачной причудой Java. Если бы у Java были правильные дженерики, я бы сказал, что ваш синтаксис сработал бы.