JSONをKotlinデータクラスに変換 — Numio
JSON サンプルから Kotlin の data class を生成します。整数は Long、小数は Double になり、ネストしたオブジェクトはそれぞれ独自のクラスになります。配列の一部の要素にしかないキーは Boolean? のような null 許容型になります。
Jackson で JSON を解析する Android アプリ向けに REST レスポンスをモデル化する。
こんなときに使えます
- Jackson で JSON を解析する Android アプリ向けに REST レスポンスをモデル化する。
- サンプルペイロードから Ktor や Spring Boot サービスの DTO を作る。
使い方
- 代表的な JSON オブジェクトまたは配列を JSON エディターに貼り付けます。省略可能なキーがわかる配列要素も含めてください。
- Kotlin パネルを確認します。最上位のクラス名は Root で、ネストしたクラスはキー名から命名されます(projects は Project になります)。
- クラスをコピーして 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> に変更してください。