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