Васильев Андрей Михайлович
Версии презентации
Представляет собой набор инструментов для обработки данных на JVM-платформе
Полезные ссылки:
Основой для эффективной обработки JSON-документов является ядро библиотеки, которое предоставляет средства для потоковой обработки данных
В список зависимостей приложения необходимо добавить Maven-артефакт:
"com.fasterxml.jackson.core:jackson-core:2.21.0"Документацию по классам библиотеки можно посмотреть https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-core/2.21.0/index.html
JsonFactoryBuilder — строитель фабрики ключевых объектовJsonFactory — фабрика объектов для считывания или записиJsonGenerator — генератор JSON, создаётся отдельно для каждого документаJsonParser — считыватель JSON, создаётся отдельно для каждого документаС помощью JsonFactoryBuilder можно настроить общие параметры путём включения и выключения
Фабрика JsonFactory предоставляет ряд методов для создания генератора, который сможет записать свои данные: в выходной поток, файл, объект приёма данных
Помимо целевого объекта этим методам также можно передать кодировку данных
Для создания генератора, записывающего данные на стандартный поток вывода достаточно:
val factory: JsonFactory = JsonFactoryBuilder().build()
val outputGenerator: JsonGenerator = factory.createGenerator(System.out)
outputGenerator.prettyPrinter = DefaultPrettyPrinter()По окончании формировании JSON-документа необходимо вызвать метод close()
При формировании JSON-документа необходимо последовательно описывать состояние целевого JSON-документа, включая все его компоненты
writeStartArray()writeEndArray()writeStartObject()writeStartObject()writeFieldName(name)writeString(value)writeNumber(value)writeBoolean(value)writeNull()writeNumberField(name, value)Создадим следующий JSON-документ с потоковой записью данных
{
"sides" : [ 5, 3, 4 ],
"color" : "RED",
"cool" : true
}with(outputGenerator) {
writeStartObject()
writeFieldName("sides")
writeStartArray()
writeNumber(5)
writeNumber(3)
writeNumber(4)
writeEndArray()
writeFieldName("color")
writeString("RED")
writeBooleanField("cool", true)
writeEndObject()
close()
}Потоковая запись данных является самым быстрым и эффективным способом формирования JSON-документов
Однако каждый документ можно соотнести к некоторой сложной структурой данных внутри приложения, которая включает в себя множество сложных полей и их значений
Модуль jackson-databind предоставляет соответствующие средства, позволяющие решить данную задачу. Данный модуль рассчитан на использование с ЯП Java
Для поддержки данной функциональности в Kotlin на платформе JVM используйте модуль jackson-module-kotlin:
com.fasterxml.jackson.module:jackson-module-kotlin:2.21.0Для выполнения преобразования Kotlin-объекта в JSON-документ и наоборот необходимо создать компонент отображения объектов, ObjectMapper:
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
val mapper = jacksonObjectMapper()Для работы также необходимо определить класс данных Kotlin, который будет формировать данные
data class Triangle(val sideA: Double, val sideB: Double, val sideC: Double)Создадим на основе объекта данного класса соответствующий JSON-документ:
val triangle = Triangle(3.0, 4.0, 5.0)
mapper.writeValue(System.out, triangle)Получим следующий вывод:
{"sideA":3.0,"sideB":4.0,"sideC":5.0}Компонент отображения объектов использует рефлексию, чтобы получить список свойств объекта, их типы и значения
Можно использовать аннотации для настройки поведения компонента отображения
Список доступных аннотаций и их воздействие на отображение данных можно прочитать в https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-annotations/2.21.0/index.html
Также стоит отметить аннотации для поддержки классов описания дат https://github.com/FasterXML/jackson-modules-java8
data class Pseudo(
@JsonProperty("Money")
val info: Int,
)
val mapper = jacksonObjectMapper()
mapper.enable(SerializationFeature.INDENT_OUTPUT)
println(mapper.writeValueAsString(Pseudo(10)))Результат работы кода:
{
"Money" : 10
}