KotlinのNull安全でJSON Nullableフィールドを処理する

KotlinのNull安全システムがJSON null値にどのようにマッピングされるかを学びます。nullable型、?演算子、欠落フィールドのデフォルト値、安全なアクセスパターンを解説します。

Basic Data Classes

詳細な説明

KotlinのNull安全とJSON

Kotlinの型システムはnullable(String?)型と非nullable(String)型を区別します。JSONフィールドがnullまたは欠落する可能性がある場合、data classでnullable型を使用する必要があります。

JSONの例

{
  "id": 1,
  "name": "Alice",
  "nickname": null,
  "bio": null,
  "verified": true
}

生成されるKotlin

data class User(
    val id: Int,
    val name: String,
    val nickname: String?,
    val bio: String?,
    val verified: Boolean
)

Nullable型を使うべき場面

?を使用する場合:

  • JSONフィールドが明示的にnullになりうる場合
  • 特定のレスポンスでフィールドが欠落する可能性がある場合
  • APIドキュメントでオプションと記載されている場合

非nullableを維持する場合:

  • フィールドが常に存在し、nullでない場合
  • デシリアライザーにデータ欠落時にエラーを投げさせたい場合(フェイルファスト)

安全なアクセスパターン

// 安全呼び出し演算子
val length = user.nickname?.length

// Elvisオペレーターでデフォルト値
val displayName = user.nickname ?: user.name

// letブロックで非null操作
user.bio?.let { bio ->
    println("Bio: $bio")
}

Nullable vs デフォルト値

nullable型とデフォルト値を組み合わせて、欠落フィールドを優雅に処理できます:

@Serializable
data class User(
    val id: Int,
    val name: String,
    val nickname: String? = null,
    val bio: String? = null,
    val verified: Boolean = false
)

kotlinx.serializationでは、デフォルト値を持つフィールドはJSONに存在しなくてもエラーになりません。

!!アンチパターン

デシリアライズされたデータに非null表明演算子!!を使用することを避けてください。KotlinのNull安全を無効にし、値がnullの場合にNullPointerExceptionがスローされます。??:、または説明的メッセージ付きのrequireNotNull()を使用してください。

ユースケース

データベースバックのAPIは値のないカラムに対してnullを返すことが多いです。Kotlinのnullable型を使用することで、bioを空に設定したユーザーとそもそも設定していないユーザーを区別でき、Androidアプリでの正確なフォーム処理に不可欠です。

試してみる — JSON to Kotlin

フルツールを開く