JSON から Java クラスへ
JSON のサンプルを貼り付けると、適切なフィールド型、ゲッター、セッター、JSON ライブラリのアノテーションを備えた 1 つ以上の Java クラスを生成します。よりクリーンなコードのために Jackson(@JsonProperty)、Gson(@SerializedName)、Lombok(@Data/@Builder)に対応。ネストされたオブジェクトは、選択したレイアウトに応じて内部クラスまたは同階層のクラスになります。
JSON を Java に変換する方法
-
1
JSON を貼り付ける
サンプルは 1 つで十分です。複数のサンプルを使うと、null 許容性の判定精度が向上します。
-
2
ライブラリを選ぶ
Jackson(Spring で最も一般的)、Gson(Android や一部のレガシープロジェクト向け)、またはアノテーションなしのシンプルな POJO。
-
3
追加オプションを選ぶ
ゲッター/セッターの自動生成、ビルダーパターン、equals/hashCode を使うなら Lombok を。不要ならそのままプレーンに。
-
4
ネストのスタイルを選ぶ
同一ファイル内の同階層クラス(Java 17 以降では public クラスは別々のファイルにする必要があります)、またはネストされた静的クラス。
-
5
コードをコピーする
そのままプロジェクトに貼り付けられます。クラス名は JSON のキーと一致し、パッケージは設定した内容に従います。
出力例:Jackson + Lombok
入力:
{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }
出力:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
@JsonProperty("firstName")
private String firstName;
@JsonProperty("age")
private int age;
@JsonProperty("address")
private Address address;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {
@JsonProperty("city")
private String city;
}
型のマッピング
| JSON | Java の型 |
|---|---|
| 文字列 | String |
| 整数(≤ Integer.MAX) | Integer / int |
| 大きな整数 | Long / BigInteger |
| 小数 | Double / BigDecimal |
| 真偽値 | Boolean / boolean |
| ISO 日付 | LocalDate(Jackson JSR-310) |
| ISO 日時 | Instant / OffsetDateTime |
| null(非 null の同階層フィールドあり) | ラッパー型(例:Integer) |
| 配列 | List<T> |
| オブジェクト | ネストクラス |
ラッパー型とプリミティブ型の選び方
- プリミティブ型(
int、long、boolean)、null 不可、効率的で、オートボクシングが発生しません。 - ラッパー型(
Integer、Long、Boolean)、null 可。フィールドが JSON で欠落したり null になったりする可能性がある場合に必要です。
ジェネレーターは、null になり得ると判断したものはラッパー型を、それ以外はプリミティブ型をデフォルトで採用します。
Jackson と Gson の比較
| 機能 | Jackson | Gson |
|---|---|---|
| Spring での普及度 | あり(デフォルト) | なし(設定が必要) |
| パフォーマンス | 速い | 遅い |
| JSR-310 の日付サポート | 追加モジュール経由 | 追加モジュール経由 |
| 多態性 | @JsonTypeInfo |
RuntimeTypeAdapter |
| 末尾カンマの許容 | なし(デフォルト) | あり |
よくある間違い
- null 可のフィールドにプリミティブ型を使う。
intは null にできず、JSON に"age": nullがあると Jackson は例外をスローします。Integerを使いましょう。 - 日付モジュールの不足。
Instant/LocalDateにはjackson-datatype-jsr310が必要です。これがないと、日付はStringやエポック値の long にフォールバックします。 - 無関係なクラス間でラッパー型を共有する。 2 つの JSON 構造がどちらもネストした
Addressを持つ場合、ジェネレーターは 2 つのAddressクラスを生成します。手動で名前変更または統合してください。 @JsonIgnoreProperties(ignoreUnknown = true)の付け忘れ。 厳格な Jackson は未知のプロパティで例外をスローします。寛容なデシリアライズのために、このアノテーションを追加(またはグローバルに設定)してください。
よくある質問
たいていの場合は Jackson です。Spring のデフォルトであり、速く、多態性のサポートも充実しています。Gson はより軽量で Android でよく知られていますが、Android プロジェクトでは近年 Moshi や kotlinx.serialization の採用が増えています。
Lombok は多くのボイラープレート(getter、setter、equals、hashCode、builder)を削減します。広く使われていますが、ビルドに Lombok のアノテーションプロセッサーが必要です。依存関係を整理したいなどの理由で Lombok を避けているプロジェクトでは無効にしてください。
観測されたいずれかのサンプルで null になるフィールドはラッパー型(int ではなく Integer)になり、null を保持できます。これにより Jackson は "age": null をエラーなくデシリアライズします。シリアライズ時に null を除外するには @JsonInclude(Include.NON_NULL) を追加します。
はい、「record」を選べば出力します。record は簡潔で不変であり、Jackson 2.12+ で動作します。Spring Boot 3 のプロジェクトでは、record と Lombok 不要の生成の組み合わせが今どきの選択肢です。
関連ツール
ASCII表リファレンス
0から127までの完全なASCII表です。NUL、LF、DELなどの制御コードを含め、各文字の10進数、16進数、8進数、2進数、HTML数値文字参照を表示します。
HTML文字参照
HTMLエンティティの検索可能なリスト、その名称コードおよび数値コード、および特殊文字や記号のワンクリックコピー機能を提供します。
キーボードショートカット一覧
macOS、Windows、Linux向けに、VS Code、Chrome、GNU Readlineを使うBashの公式資料に基づく既定ショートカットを検索できます。
EditorConfig ジェネレーター
インデントのスタイルとサイズ、改行コード、文字コード、空白ルールを指定して .editorconfig ファイルを生成し、IDE やエディタをまたいで書式を統一できます。
メールアドレス検証ツール
メールアドレスを検証します。RFC 5322構文チェック、MXレコードのライブ確認に加え、ローカル部、ドメイン、長さの詳細を表示します。メールは送信されません。
Markdownチートシート
見出し、リスト、表、コード、リンク、画像、GFM構文を、実際のプレビューとコピーできる例で確認できる実用的なMarkdownリファレンスです。
このツールは他の言語でも利用できます
- JSON till Java-klass [SV]
- JSON vers classe Java [FR]
- JSON naar Java-klasse [NL]
- JSON เป็นคลาส Java [TH]
- JSON sang lớp Java [VI]
- JSON إلى فئة Java [AR]
- JSON ke Kelas Java [ID]
- JSON a Clase Java [ES]
- JSON을 Java 클래스로 [KO]
- JSON zu Java-Klasse [DE]
- JSON na klasę Java [PL]
- JSON para Classe Java [PT]
- JSON в класс Java [RU]
- JSON'dan Java Sınıfına [TR]
- JSON 转 Java 类 [ZH]
- JSON to Java Class [EN]
- JSON in classe Java [IT]