Spec-Zone.ru › Kotlin 2

Сериализация 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)
        }
    }
}

Перебирать последовательности, возвращаемые .decodeToSequence(), можно только один раз, так как они связаны с базовым потоком.

При обращении к последовательности может возникнуть исключение, если базовый поток закрыт до того, как последовательность будет обработана полностью.

Сериализация 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)
        }
    }
}

Перебирать последовательности, возвращаемые .decodeSourceToSequence(), можно только один раз, так как они связаны с базовым Source.

При обращении к последовательности может возникнуть исключение, если базовый источник закрыт до того, как последовательность будет обработана полностью.

Что дальше

  • Узнайте, как настраивать экземпляры Json для различных сценариев сериализации и десериализации.

  • Изучите расширенную обработку элементов JSON, чтобы манипулировать данными JSON и работать с ними до их разбора или сериализации.

  • Узнайте, как преобразовывать JSON при сериализации и десериализации, чтобы получить больше контроля над данными.

10 июня 2026 г.
Преобразование структуры 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API