Джексон, отображающий JSON в Java POJO - MismatchedInstanceException - PullRequest
0 голосов
/ 01 мая 2019

Я использую шаблон весеннего отдыха и хочу проанализировать ответ JSON в соответствующий java POJO. Я получаю каждый раз MismatchedInputException - Невозможно десериализовать экземпляр маркера массива из начального.

Я рассмотрел несколько вопросов, касающихся Джексона, но не нашел подходящего решения. Я не уверен, что моя структура POJO правильная.

Сначала соответствующий JSON:

{
   "days":[
      [
         {
            "day":"2019-04-29",
            "time":"08:00-09:30",
            "room":"room1",
            "name":"lecture1",
            "lecturer":"prof1",
            "eventId":332713,
            "modified":false
         }
      ],
      [

      ],
      [

      ],
      [
         {
            "day":"2019-05-02",
            "time":"08:00-10:15",
            "room":"room2",
            "name":"lecture2",
            "lecturer":"prof2",
            "eventId":332714,
            "modified":false
         },
         {
            "day":"2019-05-02",
            "time":"10:45-13:00",
            "room":"room3",
            "name":"lecture3",
            "lecturer":"prof3",
            "eventId":332721,
            "modified":false
         }
      ],
      [

      ],
      [

      ],
      [
      ]
   ]
}

POJO Состав:

public class Main{

    ArrayList<Day> days = new ArrayList<>();

    public ArrayList<Day> getDays() {
        return days;
    }

    public void setDays(ArrayList<Day> days) {
        this.days = days;
    }

    public class Day {

        private String day;
        private String time;
        private String room;
        private String name;
        private String lecturer;
        private Integer eventId;
        private Boolean modified;

        public Day() {
        }
       // Getter and setter of Day Object
    }
}

Метод Rest-Template в объекте API:


public String getInfoByEventsPeriods(String eventIDs) {
        String url = APIURL + "/info?from="2019-04-29"&to="2019-05-03"&eventId=" + eventIDs;

        return rest.getForObject(url, String.class);
    }

Обработка с помощью ObjectMapper в главном объекте:

public Main getLectures(String eventIDs) throws IOException {
        API api = new API();
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(api.getInfoByEventsPeriods(eventIDs), Main.class);

    }

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Да, вы правы, при десериализации используется неправильный тип.
Я точно не уверен, но ваш массив days содержит еще один массив с day объектами, но в вашей структуре ArrayList состоит изобъекты day, а не их массив.

Правильный JSON будет:

{
   "days":[
         {
            "day":"2019-04-29",
            "time":"08:00-09:30",
            "room":"room1",
            "name":"lecture1",
            "lecturer":"prof1",
            "eventId":332713,
            "modified":false
         },
         {
            "day":"2019-05-02",
            "time":"08:00-10:15",
            "room":"room2",
            "name":"lecture2",
            "lecturer":"prof2",
            "eventId":332714,
            "modified":false
         },
         ......
   ]
}   

Таким образом, измените структуру ответа или объект pojo в зависимости от того, что нужно исправить.
Если вам нужно изменить POJO, ваш ArrayListдолжен содержать List дней.

0 голосов
/ 01 мая 2019

Можете ли вы иметь свой POJO, как показано ниже. Я попытался десериализовать с помощью вашего JSON и смог успешно десериализоваться.

class Day {

  private String day;
  private String time;
  private String room;
  private String name;
  private String lecturer;
  private Integer eventId;
  private Boolean modified;

  public void setDay(String day) {
    this.day = day;
  }

  public void setTime(String time) {
    this.time = time;
  }

  public void setRoom(String room) {
    this.room = room;
  }

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

  public void setLecturer(String lecturer) {
    this.lecturer = lecturer;
  }

  public void setEventId(Integer eventId) {
    this.eventId = eventId;
  }

  public void setModified(Boolean modified) {
    this.modified = modified;
  }
}

class Main{
  private List<List<Day>> days;
  public void setDays(List<List<Day>> days) {
    this.days = days;
  }
}

enter image description here

...