为了账号安全,请及时绑定邮箱和手机立即绑定

Jackson 将 JSON 映射到 Java POJO

Jackson 将 JSON 映射到 Java POJO

慕哥9229398 2022-11-02 15:39:22
我正在使用 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);    }
查看完整描述

2 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

是的,你是对的,反序列化时使用了错误的类型。

我不确定,但是您的days数组包含另一个带有day对象的数组,但是在您的结构中 ArrayList 由 objects 组成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天数。


查看完整回答
反对 回复 2022-11-02
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

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

  }

}

//img1.sycdn.imooc.com//63621ed60001424825600705.jpg

查看完整回答
反对 回复 2022-11-02
  • 2 回答
  • 0 关注
  • 219 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号