【问题标题】:Can serialise OK, deserialise gives MismatchedInputException可以反序列化OK,反序列化给出MismatchedInputException
【发布时间】: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)

【问题讨论】:

    标签: json exception jackson


    【解决方案1】:

    我认为 Jackson 对您选择 Collection 实现(LinkedHashMap、ArrayList)而不是接口(@98​​7654324@、List)有问题。 通常杰克逊会选择一些默认值(例如ArrayList 为List 我猜)。

    请参阅此答案以指定预期的接口实现:

    Jackson - How to specify a single implementation for interface-referenced deserialization?

    【讨论】:

      【解决方案2】:

      我刚刚发现我做错了什么。我正在将 JSON 写入文件,然后读取文件进行反序列化。嗯,这就是我以为我在做的。原来,我正在写一个文件并读取另一个文件。看到那个愚蠢的错误后,JSON 就可以正常工作了,序列化和反序列化没有问题。

      感谢您的回答,但我真正需要的是解决愚蠢问题。

      【讨论】:

        猜你喜欢
        • 2019-09-17
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多