欠落するJSONフィールドにKotlin Data Classのデフォルト値を使用する
Kotlinのデフォルトパラメータ値がデシリアライゼーション時に欠落またはオプションのJSONフィールドをどう処理するかを学びます。coerceInputValues、encodeDefaults、部分更新パターンを解説します。
Serialization
詳細な説明
欠落するJSONフィールドのデフォルト値
Kotlin data classはデフォルトパラメータ値をサポートしており、JSONデシリアライゼーションと自然に組み合わせられます。JSONにフィールドが存在しない場合、エラーをスローする代わりにデフォルト値が使用されます。
JSONの例(部分ペイロード)
{
"name": "Alice",
"email": "alice@example.com"
}
デフォルト値付きData Class
@Serializable
data class User(
val name: String,
val email: String,
val role: String = "viewer",
val verified: Boolean = false,
val loginCount: Int = 0,
val bio: String? = null
)
欠落フィールド(role、verified、loginCount、bio)はデフォルト値を使用します。存在するフィールド(name、email)は通常通りデシリアライズされます。
Json設定
val json = Json {
ignoreUnknownKeys = true // data classにないJSONキーをスキップ
coerceInputValues = true // 非nullableフィールドのnullにデフォルトを使用
encodeDefaults = false // シリアライズ時にデフォルト値を省略
}
coerceInputValues
JSONがデフォルト値を持つ非nullableフィールドにnullを送信した場合:
{ "name": "Alice", "role": null }
coerceInputValuesなし:シリアライゼーション例外をスロー。
coerceInputValues = true:デフォルト値"viewer"を使用。
encodeDefaults
デフォルト値がシリアライズ出力に表示されるかを制御:
// encodeDefaults = false(デフォルト)
// 出力: {"name":"Alice","email":"alice@example.com"}
// encodeDefaults = true
// 出力: {"name":"Alice","email":"alice@example.com","role":"viewer","verified":false,"loginCount":0,"bio":null}
部分更新パターン
デフォルトはPATCHスタイルのAPIで特に便利です:
@Serializable
data class UserUpdate(
val name: String? = null,
val email: String? = null,
val bio: String? = null
)
// 提供されたフィールドのみがnon-null
val update = json.decodeFromString<UserUpdate>(patchBody)
if (update.name != null) updateName(update.name)
デフォルト vs Nullable
val role: String = "viewer"-- 常に値を持つ;JSONが欠落するとデフォルトを使用val bio: String? = null-- nullになりうる;「未設定」を表す- デフォルト付き
val bio: String? = null-- 欠落と明示的nullの両方を処理
ドメインに基づいて選択してください:「欠落」は「デフォルトを使用」を意味するのか、「該当なし」を意味するのか?
ユースケース
設定エンドポイントやユーザープリファレンスAPIは、すべてのフィールドが存在しない部分的なJSONを返すことが多いです。Kotlin data classのデフォルト値により、コードベースにnullチェックや手動フォールバックロジックを散りばめることなく優雅に処理できます。