Путь обновления для формата файла json - PullRequest
3 голосов
/ 21 июня 2011

Мы сохраняем пользовательские настройки для приложения Java в файле JSON, используя Jackson . По мере продолжения разработки приложения мы будем добавлять настройки, переименовывать настройки и удалять устаревшие настройки. Когда пользователь обновит приложение до следующей версии, формат файла, скорее всего, изменится. Это заставляет Джексона выдавать исключение, и файл не может быть проанализирован, даже если формат на 90% одинаков. Как мне справиться с обновлением формата файла?

Я думал об использовании JSONT для обновления файла, а также о написании моего собственного анализатора потоков Джексона, который более мягок, чем анализатор с полной связью, на случай, если с обновлением JSONT что-то пойдет не так. Что другие люди сделали для обновления форматов файлов?

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Помимо поддержки управления версиями (которая, как правильно отмечает Брюс, является одной из функций, которую можно добавить относительно легко), обычно выполняется простое разрешение игнорирования нераспознанных свойств вместо исключения.

Есть несколько способов сделать это (см. " Как игнорировать неизвестные свойства "; самый простой из них - просто глобально изменить поведение следующим образом:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Структурные изменения сложнее, поэтомуЭто может быть хорошей стратегией, чтобы избежать структурных изменений, отличных от добавления / удаления свойств. Например, вместо изменения свойства с JSON Object на JSON Array (или наоборот) добавьте новое свойство с новым типом, не используйте старый.

3 голосов
/ 21 июня 2011

У Джексона в настоящее время нет встроенной поддержки версий JSON, как у Gson . Выпуск Джексона 108 был зарегистрирован более двух лет назад для решения проблемы такого возможного улучшения. Пожалуйста, не стесняйтесь голосовать за его реализацию. (Я только что сделал.)

Подход, который я выбрал бы, состоял бы в том, чтобы реализовать собственное решение для поддержки версий JSON, аналогично тому, как это делает Gson. (Одной этой функции, вероятно, было бы недостаточно, чтобы я переключился на Gson.) Тогда логика обработки вашего Java-компонента может быть относительно простой в отношении обработки различных версий либо после десериализации, либо во время пользовательской десериализации.

1 голос
/ 22 августа 2016

Как сказал @ programmer-bruce, на момент написания этой статьи встроенной поддержки Джексона не было (2.9.x).Тем не менее, Модуль управления версиями модели Джексона добавляет поддержку управления версиями, которую можно использовать для преобразования старых версий моделей JSON в текущую версию (и наоборот) перед сопоставлением с POJO.

См. Мой ответ о поддержке Jackson 2 для управления версиями , чтобы узнать, как основные функциональные возможности GSON могут быть привязаны к этому модулю.

Отказ от ответственности: я являюсь автором этого модуля.Смотрите страницу проекта GitHub для большего количества примеров дополнительной функциональности.Я также написал Spring MVC ResponseBodyAdvise для использования модуля.

...