本文へスキップ

JSONをKotlinデータクラスに変換 — Numio

JSON サンプルから Kotlin の data class を生成します。整数は Long、小数は Double になり、ネストしたオブジェクトはそれぞれ独自のクラスになります。配列の一部の要素にしかないキーは Boolean? のような null 許容型になります。

Jackson で JSON を解析する Android アプリ向けに REST レスポンスをモデル化する。

JSON

Kotlin

こんなときに使えます

  • Jackson で JSON を解析する Android アプリ向けに REST レスポンスをモデル化する。
  • サンプルペイロードから Ktor や Spring Boot サービスの DTO を作る。

使い方

  1. 代表的な JSON オブジェクトまたは配列を JSON エディターに貼り付けます。省略可能なキーがわかる配列要素も含めてください。
  2. Kotlin パネルを確認します。最上位のクラス名は Root で、ネストしたクラスはキー名から命名されます(projects は Project になります)。
  3. クラスをコピーして Root の名前を変え、API の仕様に合わせて Any? や Long を置き換えます。

JSON 入力

{
  "id": 1024,
  "full_name": "Ada Lovelace",
  "email": null,
  "roles": ["admin", "editor"],
  "projects": [
    { "name": "Engine", "stars": 42 },
    { "name": "Notes", "stars": 7, "archived": true }
  ]
}

Kotlin data class

import com.fasterxml.jackson.annotation.JsonProperty

data class Root(
    val id: Long,
    @JsonProperty("full_name")
    val fullName: String,
    val email: Any?,
    val roles: List<String>,
    val projects: List<Project>,
)

data class Project(
    val name: String,
    val stars: Long,
    val archived: Boolean?,
)

仕様と制限

変換はブラウザ内で json_typegen の WebAssembly モジュールにより行われ、JSON はアップロードされません。このページに設定項目はありません。

camelCase でないキーには Jackson の @JsonProperty アノテーションと import com.fasterxml.jackson.annotation.JsonProperty が付きます。kotlinx.serialization や Moshi のアノテーションは生成されません。

null 値と空配列は型情報を持たないため、Any? と List<Any?> になります。

null 許容フィールドにはデフォルト値(= null)がありません。デシリアライズ時にフィールドが欠ける可能性がある場合は、自分でデフォルト値を追加してください。

FAQ

整数が Int ではなく Long になるのはなぜですか?

大きな ID がオーバーフローしないよう、ジェネレーターは整数に常に Long を使います。64 ビット整数に収まらない数や小数点付きの数は Double になります。

ルートが配列の JSON も変換できますか?

できます。ルート配列からは typealias Root = List<Root2>; のような typealias と、要素型を表す data class Root2 が生成されます。両方ともコードに合わせて名前を変えてください。

短い混在型の配列が Pair<Long, String> になったのはなぜですか?

json_typegen は要素の型が異なる短い配列をタプルとして扱うため、[1, "a"] は Pair<Long, String> になります。実際にはリストである場合は List<Any> に変更してください。

仕様を確認する