杰克逊将JSON映射到Java POJO-MismatchedInstanceException

时间:2019-04-30 21:35:26

标签: java spring-mvc jackson resttemplate pojo

我正在使用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对象中的其他模板方法:


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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您能否像下面这样拥有您的POJO。我尝试使用您的JSON反序列化,并且能够成功反序列化。

name

enter image description here

相关问题