Введение в модуль Jackson Kotlin и обнуляемый тип Kotlin для отсутствующих значений в данных

Jackson - одна из самых известных библиотек для анализа данных XML или JSON, хотя для Kotlin требуются некоторые ключевые факторы, чтобы избежать неожиданных проблем.
Необходим конструктор по умолчанию
По умолчанию Java предоставляет конструктор по умолчанию (если нет параметризованного конструктора), который используется Jackson для синтаксического анализа ответа в классы POJO или bean-компонентов.
Kotlin предоставляет функцию data классов, которые не предоставляют конструктор по умолчанию (вместо этого он использует конструктор параметризации), поэтому анализ ответа в Kotlin приведет к InvalidDefinitionException исключению как:
где Person класс - это простой data класс с двумя свойствами
data class Person(var name: String, var occupation: String)
и журнал исключений.
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `Person` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{
"name": "Pavneet",
"occupation": "Software Engineer"
}"
Классы данных имеют ограничение на наличие хотя бы одного параметра первичного конструктора, поэтому конструктор по умолчанию / без аргументов недоступен по умолчанию в классах данных.
Джексон не может найти конструктор по умолчанию, поэтому он не может создать объект класса Person и выбросить InvalidDefinitionException исключение.
Эта проблема может быть исправлена с помощью аннотации @JsonProperty, которая указывает Jackson использовать сеттеры и геттеры для синтаксического анализа как:
Исключение также можно исправить, создав обычный класс вместо класса data как:
Внутри компилятор будет генерировать public сеттеры / получатели для доступа к свойствам class и будет иметь возможность конструктора по умолчанию.
Модуль Джексона Котлина
Добавление JsonProperty удобно, когда имена свойств отличаются от ответа (что не является нашим вариантом использования). В качестве альтернативы Jackson предоставляет отдельный модуль jackson-module-kotlin с классом KotlinModule для решения этой проблемы:
KotlinModule может быть зарегистрирован во время выполнения с помощью объекта сопоставления как:
val mapper = ObjectMapper().registerModule(KotlinModule())
Теперь нет необходимости добавлять @JsonProperty в классы данных / моделей.
KotlinModule внутренне использует специфичные для Kotlin API отражения, которые обрабатывают отображение KClass, KFunction в классы Java с помощью пакетов kotlin.jvm и kotlin.reflect.jvm.
Обработка отсутствующих значений
По умолчанию Джексон использует null для отсутствующих значений, но вы, возможно, догадались, Kotlin не допускает null в качестве значения, поэтому, если значение отсутствует, например, occupation
{
"name": "Pavneet",
}
тогда свойство occupation необходимо пометить в Kotlin как допускающее значение NULL, используя ? , чтобы избежать исключений, например:
Исходный код доступен на ithub g
Вики модуля Jackson kotlin находится в стадии разработки, хотя вы можете следить за README.md и читать больше о Джексоне в документации и здесь (краткое введение).
Удачного кодирования 😀