Kotlin Academy · レッスン

Content Negotiationとkotlinx.serialization

JSONシリアライゼーションを設定し、リクエストボディを自動的にデシリアライズします。

レッスン 3/413 ステップ

「Content Negotiationとkotlinx.serialization」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

Content Negotiationとは

Content negotiationは、クライアントとサーバーがレスポンスボディの形式について合意するHTTPの仕組みです。クライアントは Accept ヘッダーを送信し、サーバーは最も適合する形式を選択します。Ktorの ContentNegotiation プラグインがこの処理を自動化します。

依存関係の追加

ContentNegotiationプラグインと、kotlinx.serializationのJSONコンバーターを追加します。

dependencies {
    implementation("io.ktor:ktor-server-content-negotiation:2.3.12")
    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1")
}

ContentNegotiationのインストール

Applicationモジュールにプラグインをインストールし、JSONコンバーターを登録します。

import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*

fun Application.configureSerialization() {
    install(ContentNegotiation) {
        json()
    }
}

@Serializableデータクラス

kotlinx.serializationの @Serializable でデータクラスにアノテーションを付けます。Kotlinコンパイラプラグインがコンパイル時にシリアライザーを生成するため、実行時のリフレクションは必要ありません。

import kotlinx.serialization.Serializable

@Serializable
data class User(val id: Long, val name: String, val email: String)

Serializableオブジェクトのレスポンス

ContentNegotiationをインストールすると、任意の @Serializable オブジェクトを call.respond() に渡せます。Ktorが自動的にJSONへシリアライズします。

get("/users/{id}") {
    val user = User(1L, "Alice", "alice@example.com")
    call.respond(user)  // serialized to JSON
}

Serializableオブジェクトの受け取り

call.receive() を使用すると、リクエストボディを @Serializable クラスへデシリアライズできます。ボディの形式が不正な場合、Ktorは ContentTransformationException をスローします。

post("/users") {
    val newUser = call.receive<User>()
    call.respond(HttpStatusCode.Created, newUser)
}

JSON設定のカスタマイズ

Json インスタンスを json() に渡すと、シリアライズをカスタマイズできます。未知のキーの無視、整形出力、寛容モードなどを設定できます。

install(ContentNegotiation) {
    json(Json {
        prettyPrint = true
        isLenient = true
        ignoreUnknownKeys = true
    })
}

複数のコンテンツタイプ

複数の Accept タイプに対応するには、複数のコンバーターを登録します。Ktorはクライアントの Accept ヘッダーに一致する最初のコンバーターを選択します。

install(ContentNegotiation) {
    json()
    // xml() with ktor-serialization-kotlinx-xml if needed
}

リストとマップのシリアライズ

コレクションをレスポンスオブジェクトでラップするか、call.respond(list) を直接使用します。要素の型が @Serializable である限り、kotlinx.serializationは List、Map、ネストしたジェネリクスを処理できます。

get("/users") {
    val users = listOf(
        User(1, "Alice", "a@example.com"),
        User(2, "Bob", "b@example.com")
    )
    call.respond(users)
}

カスタムシリアライザー

自分で所有していない型(例:java.time.Instant)には、KSerializer を実装し、@Serializable(with = MySerializer::class) またはコンテキストシリアライザーモジュールを使用して登録します。

val module = SerializersModule {
    contextual(Instant::class, InstantSerializer)
}
install(ContentNegotiation) {
    json(Json { serializersModule = module })
}

デシリアライズ失敗時のエラー処理

StatusPagesプラグインをインストールすると、call.receive()が失敗したときに、適切なエラーレスポンスを返せます:

install(StatusPages) {
    exception<ContentTransformationException> { call, _ ->
        call.respond(HttpStatusCode.BadRequest, "Invalid request body")
    }
}

クイックチェック

kotlinx.serializationでKotlinのデータクラスをシリアライズ可能にするには、どのアノテーションが必要ですか?

振り返り:Content Negotiationとkotlinx.serialization

重要なポイント:

  • 自動的にJSONをシリアライズ/デシリアライズするには、ContentNegotiationとjson()をインストールします
  • データクラスに@Serializableを付けます
  • シリアライズにはcall.respond(obj)を、デシリアライズにはcall.receive()を使用します
  • json()に渡すJson { ... }インスタンスでカスタマイズします
  • デシリアライズエラーを適切に処理するにはStatusPagesを使用します
無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「Content Negotiationとkotlinx.serialization」レッスンは無料ですか?

はい。「Content Negotiationとkotlinx.serialization」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「Content Negotiationとkotlinx.serialization」で何を学びますか?

JSONシリアライゼーションを設定し、リクエストボディを自動的にデシリアライズします。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「Content Negotiationとkotlinx.serialization」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Ktorプロジェクトのセットアップ:embeddedServerとApplicationモジュール
  2. ルーティングと型付きパラメータ
  3. Content Negotiationとkotlinx.serialization
  4. 認証プラグイン:JWTとSession
← Kotlin Academyに戻る