【问题标题】:Jackson mapping JSON to Java POJO - MismatchedInstanceExceptionJackson 将 JSON 映射到 Java POJO - MismatchedInstanceException
【发布时间】:2019-04-30 21:35:25
【问题描述】:

我正在使用 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);

    }

【问题讨论】:

    标签: java spring-mvc jackson resttemplate pojo


    【解决方案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 天数。

    【讨论】:

      【解决方案2】:

      你能像下面这样拥有你的 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;
        }
      }
      

      【讨论】:

      • 谢谢,成功了。一旦我将对象 Day 作为 Main Object 中的内部对象,它就不起作用了,但是在创建了两个自己的对象之后,它就可以完美地工作了!非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2015-07-01
      • 2017-02-24
      相关资源
      最近更新 更多