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アプリでの正確なフォーム処理に不可欠です。