【发布时间】:2019-07-20 08:09:26
【问题描述】:
我第一次尝试使用 JSON。我有一些代码可以很好地序列化我的对象,但是尝试反序列化我得到了 MismatchedInputException,无法从 START_ARRAY 令牌中反序列化 com.john.irrigator3.irrigation.WateringSchedule 的实例
我猜 Jackson 在我的 WateringScheduleCollection 中反序列化数组时遇到了问题,我尝试更改添加到数组的方法的名称,没有创建参数构造函数,但我被卡住了。谁能告诉我我要去哪里拧?
WaterScheduleCollection:
public class WateringScheduleCollection {
Map<String, WateringSchedule> schedules = new LinkedHashMap<>();
public void removeSchedule(String name) {
schedules.remove(name);
}
public void addSchedule(WateringSchedule wateringSchedule) {
schedules.put(wateringSchedule.getName(), wateringSchedule);
}
public Map<String, WateringSchedule> getSchedules() {
return schedules;
}
}
浇水时间表:
public class WateringSchedule {
String name;
ArrayList<WateringRoutine> wateringRoutines;
SeasonLimits seasonLimits = null;
int sprinkleDuration = 30;
public WateringSchedule() {
wateringRoutines = new ArrayList<WateringRoutine>();
}
public WateringSchedule(List<WateringRoutine> wateringRoutines) {
this();
for (WateringRoutine wateringRoutine : wateringRoutines) {
addWateringRoutine(wateringRoutine);
}
}
public void addWateringRoutine(WateringRoutine wateringRoutine) {
wateringRoutines.add(wateringRoutine);
}
public ArrayList<WateringRoutine> getWateringRoutines() {
return wateringRoutines;
}
序列化可以正常工作:
public void writeFile(){
WateringRoutine wr1 = new WateringRoutine(0,1,10);
WateringRoutine wr2 = new WateringRoutine(1,2,100);
WateringRoutine wr3 = new WateringRoutine(2,3,1000);
SeasonLimits seasonLimits = new SeasonLimits(4, 1, 6, 7);
WateringSchedule wateringSchedule1 = new WateringSchedule();
wateringSchedule1.setName("wateringSchedule1");
wateringSchedule1.addWateringRoutine(wr1);
wateringSchedule1.addWateringRoutine(wr2);
WateringSchedule wateringSchedule2 = new WateringSchedule();
wateringSchedule2.setName("wateringSchedule2");
wateringSchedule2.addWateringRoutine(wr2);
wateringSchedule2.addWateringRoutine(wr3);
WateringSchedule wateringSchedule3 = new WateringSchedule();
wateringSchedule3.setName("wateringSchedule3");
wateringSchedule3.addWateringRoutine(wr1);
wateringSchedule3.addWateringRoutine(wr2);
wateringSchedule3.addWateringRoutine(wr3);
wateringSchedule3.setSeasonLimits(seasonLimits);
WateringScheduleCollection wateringScheduleCollection = new WateringScheduleCollection();
wateringScheduleCollection.addSchedule(wateringSchedule1);
wateringScheduleCollection.addSchedule(wateringSchedule2);
wateringScheduleCollection.addSchedule(wateringSchedule3);
ObjectMapper mapper = new ObjectMapper();
mapper.getSerializerProvider().setNullKeySerializer(new MyDtoNullKeySerializer());
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String json = null;
try {
json = mapper.writeValueAsString(wateringScheduleCollection);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
System.out.println(json);
}
给出这个输出:
{
"schedules" : {
"wateringSchedule1" : {
"name" : "wateringSchedule1",
"wateringRoutines" : [ {
"secsWatering" : 1,
"hoursAllowedWithoutWater" : 10.0,
"scheduleSprinkle" : false,
"age" : 0
}, {
"secsWatering" : 2,
"hoursAllowedWithoutWater" : 100.0,
"scheduleSprinkle" : false,
"age" : 1
} ],
"seasonLimits" : null,
"sprinkleDuration" : 30
},
"wateringSchedule2" : {
"name" : "wateringSchedule2",
"wateringRoutines" : [ {
"secsWatering" : 2,
"hoursAllowedWithoutWater" : 100.0,
"scheduleSprinkle" : false,
"age" : 1
}, {
"secsWatering" : 3,
"hoursAllowedWithoutWater" : 1000.0,
"scheduleSprinkle" : false,
"age" : 2
} ],
"seasonLimits" : null,
"sprinkleDuration" : 30
},
"wateringSchedule3" : {
"name" : "wateringSchedule3",
"wateringRoutines" : [ {
"secsWatering" : 1,
"hoursAllowedWithoutWater" : 10.0,
"scheduleSprinkle" : false,
"age" : 0
}, {
"secsWatering" : 2,
"hoursAllowedWithoutWater" : 100.0,
"scheduleSprinkle" : false,
"age" : 1
}, {
"secsWatering" : 3,
"hoursAllowedWithoutWater" : 1000.0,
"scheduleSprinkle" : false,
"age" : 2
} ],
"seasonLimits" : {
"startOfSeason" : 1554098900367,
"endOfSeason" : 1559887700367,
"monthStart" : 4,
"dayStart" : 1,
"monthEnd" : 6,
"dayEnd" : 7
},
"sprinkleDuration" : 30
}
}
}
但尝试使用此代码反序列化:
public void readFile() {
ObjectMapper objectMapper = new ObjectMapper();
try {
WateringScheduleCollection wsc = objectMapper.readValue(new File(testPath+fileName), WateringScheduleCollection.class);
System.out.println(wsc.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
结果:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.john.irrigator3.irrigation.WateringSchedule` out of START_ARRAY token
at [Source: (File); line: 3, column: 15] (through reference chain: com.john.irrigator3.irrigation.WateringScheduleCollection["schedules"]->java.util.LinkedHashMap["schedule"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
【问题讨论】: