我们使用Jackson在JSON文件中存储Java应用程序的用户首选项。在我们继续开发应用程序时,我们将添加首选项,重命名首选项以及删除过时的首选项。当用户将应用程序升级到下一版本时,文件格式可能已更改。这会导致Jackson抛出异常,即使格式相同,该文件也无法解析。我该如何处理升级文件格式?
我正在考虑使用JSONT升级文件以及编写自己的Jackson流解析器,它比完全绑定解析器更宽松,以防JSONT升级出现问题。其他人如何处理升级文件格式?
答案 0 :(得分:3)
Jackson目前没有任何内置的JSON版本支持,例如Gson does。两年前记录Jackson issue 108以解决这种可能的增强问题。请毫不犹豫地投票支持其实施。 (我刚刚做了。)
我将采用的方法是实现自定义JSON版本控制解决方案,类似于Gson的工作方式。 (仅此一个功能可能不足以让我切换到Gson。)然后,在反序列化后或自定义反序列化期间处理不同版本时,Java bean处理中的逻辑可能相对简单。
答案 1 :(得分:3)
除了版本控制支持(就像Bruce正确指出的那样,可以相对容易地添加一个功能),通常做的是简单地允许忽略无法识别的属性,而不是抛出异常。
有多种方法可以做到这一点(参见“How to ignore unknown properties”;最简单的方法是通过以下方式全局改变行为:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
结构变化更加困难,因此除了添加/删除属性之外,避免结构变化可能是一个好策略。例如,不是将属性从JSON对象更改为JSON数组(反之亦然),而是添加具有新类型的新属性,弃用旧属性。
答案 2 :(得分:1)
正如@ programmer-bruce所说,在撰写本文时,没有内置的杰克逊支持(2.9.x)。但是,Jackson Model Versioning Module添加了版本控制支持,可以在映射到POJO之前将旧版本的JSON模型转换为当前版本(反之亦然)。
请参阅我在Jackson 2 support for versioning上的答案,了解如何将GSON的基本版本控制功能映射到此模块。
免责声明:我是本单元的作者。有关其他功能的更多示例,请参阅GitHub项目页面。我还写了Spring MVC ResponseBodyAdvise来使用该模块。