Jackson 将 JSON 映射到 Java POJO - MismatchedInstanceException

Jackson mapping JSON to Java POJO - MismatchedInstanceException

我正在使用 spring rest 模板并希望将 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
    }
}

API 对象中的 Rest-Template 方法:


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);

    }

是的,你是对的,反序列化时使用了错误的类型。
我不确定,但是您的 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 天。

你能拥有如下所示的 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;
  }
}