Сериализация JSON с использованием источников ввода-вывода
Библиотека сериализации Kotlin предоставляет API для работы с потоками JVM и источниками и приемниками kotlinx-io или Okio.
Вы можете использовать эти API для сериализации и десериализации JSON напрямую из источников ввода-вывода, не создавая промежуточные строки. Эти API используют кодировку UTF-8 и выбрасывают SerializationException при обнаружении недопустимых данных JSON и IOException при сбоях ввода-вывода.
При работе с ресурсами ввода-вывода важно правильно закрывать их, чтобы избежать утечки ресурсов. Для этого можно использовать функцию .use(), которая автоматически закрывает ресурс после завершения операции.
Сериализация JSON в выходные потоки JVM
Используйте функцию расширения .encodeToStream(), чтобы сериализовать JSON непосредственно в OutputStream JVM:
// Imports declarations from the serialization library
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import java.io.FileOutputStream
@Serializable
data class Project(val name: String, val stars: Int)
fun main() {
val project = Project("kotlinx.serialization", 9000)
// Creates an OutputStream for the project.json file
FileOutputStream("project.json").use { output ->
// Serializes the project instance into the OutputStream
Json.encodeToStream(project, output)
}
}
В этом примере представление Project в формате JSON сериализуется в файл project.json.
Десериализация JSON из входных потоков JVM
Чтобы десериализовать JSON непосредственно из InputStream JVM, используйте функцию расширения .decodeFromStream():
// Imports declarations from the serialization library
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import java.io.FileInputStream
@Serializable
data class Project(val name: String, val stars: Int)
fun main() {
// Opens an InputStream
FileInputStream("project.json").use { input ->
// Deserializes the JSON contents of the InputStream into a Project instance
val project = Json.decodeFromStream<Project>(input)
// Prints the deserialized Project instance
println(project)
}
}
В этом примере содержимое JSON из входного потока десериализуется в один экземпляр Project.
Если входные данные содержат несколько объектов JSON в массиве верхнего уровня или объекты, разделенные пробельными символами, можно использовать .decodeToSequence() для ленивой обработки элементов. Это позволяет обрабатывать каждое значение по мере его разбора, например:
// Imports declarations from the serialization library
import kotlinx.serialization.*
import kotlinx.serialization.json.*
import java.io.FileInputStream
@Serializable
data class Project(val name: String, val stars: Int)
fun main() {
// Opens an InputStream for the projects.json file containing a JSON array of Project objects
FileInputStream("projects.json").use { input ->
// Lazily deserializes each Project from the InputStream
val projects = Json.decodeToSequence<Project>(input)
// Processes elements one by one
for (project in projects) {
println(project)
}
}
}
Сериализация JSON с kotlinx-io и Okio
Помимо потоков JVM, можно работать с JSON, используя типы ввода-вывода, например kotlinx.io.Sink и kotlinx.io.Source из библиотеки kotlinx-io (в настоящее время находится на уровне стабильности Alpha), а также okio.BufferedSink и okio.BufferedSource из библиотеки Okio.
Для чтения и записи JSON напрямую с помощью этих типов ввода-вывода можно использовать следующие функции расширения Json:
.encodeToSink()и.encodeToBufferedSink()— для записи JSON вkotlinx.io.Sinkилиokio.BufferedSink..decodeFromSource()и.decodeFromBufferedSource()— для чтения одного значения JSON изkotlinx.io.Sourceилиokio.BufferedSource..decodeSourceToSequence()и.decodeBufferedSourceToSequence()— для ленивого декодирования нескольких значений JSON в видеSequence<T>.
В следующих разделах приведены примеры использования типов kotlinx-io с этими API.
Типы Okio можно использовать аналогичным образом с соответствующими API okio.BufferedSink и okio.BufferedSource.
Добавление зависимостей для kotlinx-io и Okio
Чтобы использовать функции расширения с типами kotlinx-io или Okio, добавьте соответствующие зависимости:
Добавление зависимостей для kotlinx-io
// build.gradle(.kts)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-io:1.11.0")
implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.9.1")
}
<!-- pom.xml -->
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-serialization-json-io</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-io-core</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
Добавление зависимостей для Okio
// build.gradle(.kts)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-okio:1.11.0")
implementation("com.squareup.okio:okio:3.16.2")
}
<!-- pom.xml -->
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-serialization-json-okio</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>3.16.2</version>
</dependency>
</dependencies>
Сериализация JSON в приемники
Чтобы сериализовать JSON в Sink, используйте функцию .encodeToSink():
// Imports declarations from the serialization library
import kotlinx.serialization.*
import kotlinx.serialization.json.*
// Imports declarations for kotlinx-io types and JSON I/O support
import kotlinx.serialization.json.io.*
import kotlinx.io.*
import kotlinx.io.files.*
@Serializable
data class Project(val name: String, val stars: Int)
@OptIn(ExperimentalSerializationApi::class)
fun main() {
val project = Project("kotlinx.serialization", 9000)
// Creates a Sink for the project.json file
val path = Path("project.json")
SystemFileSystem.sink(path).buffered().use { sink: Sink ->
// Serializes the Project instance directly into a Sink
Json.encodeToSink(project, sink)
}
}
Десериализация JSON из источников
Чтобы десериализовать JSON из Source, используйте функцию .decodeFromSource():
// Imports declarations from the serialization library
import kotlinx.serialization.*
import kotlinx.serialization.json.*
// Imports declarations for kotlinx-io types and JSON I/O support
import kotlinx.serialization.json.io.*
import kotlinx.io.*
import kotlinx.io.files.*
@Serializable
data class Project(val name: String, val stars: Int)
@OptIn(ExperimentalSerializationApi::class)
fun main() {
// Opens a Source for the project.json file
val path = Path("project.json")
SystemFileSystem.source(path).buffered().use { source: Source ->
// Deserializes a Project instance directly from a Source
val project = Json.decodeFromSource<Project>(source)
println(project)
}
}
Если входные данные содержат большой массив JSON или несколько объектов JSON верхнего уровня, с помощью функции .decodeSourceToSequence() можно преобразовать Source в лениво декодируемую Sequence<T>.
// Imports declarations from the serialization library
import kotlinx.serialization.*
import kotlinx.serialization.json.*
// Imports declarations for kotlinx-io types and JSON I/O support
import kotlinx.serialization.json.io.*
import kotlinx.io.*
import kotlinx.io.files.*
@Serializable
data class Project(val name: String, val stars: Int)
@OptIn(ExperimentalSerializationApi::class)
fun main() {
// Opens a Source for the projects.json file containing multiple JSON objects
val path = Path("projects.json")
SystemFileSystem.source(path).buffered().use { source: Source ->
// Lazily deserializes each Project as it is read from the Source
val projects: Sequence<Project> = Json.decodeSourceToSequence(source)
for (project in projects) {
println(project)
}
}
}
Что дальше
Узнайте, как настраивать экземпляры Json для различных сценариев сериализации и десериализации.
Изучите расширенную обработку элементов JSON, чтобы манипулировать данными JSON и работать с ними до их разбора или сериализации.
Узнайте, как преобразовывать JSON при сериализации и десериализации, чтобы получить больше контроля над данными.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/serialization-json-io-sources.html