欠落する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
)

欠落フィールド(roleverifiedloginCountbio)はデフォルト値を使用します。存在するフィールド(nameemail)は通常通りデシリアライズされます。

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チェックや手動フォールバックロジックを散りばめることなく優雅に処理できます。

試してみる — JSON to Kotlin

フルツールを開く