JSON から Java クラスへ

JSON のサンプルを貼り付けると、適切なフィールド型、ゲッター、セッター、JSON ライブラリのアノテーションを備えた 1 つ以上の Java クラスを生成します。よりクリーンなコードのために Jackson(@JsonProperty)、Gson(@SerializedName)、Lombok(@Data/@Builder)に対応。ネストされたオブジェクトは、選択したレイアウトに応じて内部クラスまたは同階層のクラスになります。

JSON を Java に変換する方法

  1. 1

    JSON を貼り付ける

    サンプルは 1 つで十分です。複数のサンプルを使うと、null 許容性の判定精度が向上します。

  2. 2

    ライブラリを選ぶ

    Jackson(Spring で最も一般的)、Gson(Android や一部のレガシープロジェクト向け)、またはアノテーションなしのシンプルな POJO。

  3. 3

    追加オプションを選ぶ

    ゲッター/セッターの自動生成、ビルダーパターン、equals/hashCode を使うなら Lombok を。不要ならそのままプレーンに。

  4. 4

    ネストのスタイルを選ぶ

    同一ファイル内の同階層クラス(Java 17 以降では public クラスは別々のファイルにする必要があります)、またはネストされた静的クラス。

  5. 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>
オブジェクト ネストクラス

ラッパー型とプリミティブ型の選び方

  • プリミティブ型(intlongboolean、null 不可、効率的で、オートボクシングが発生しません。
  • ラッパー型(IntegerLongBoolean、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 不要の生成の組み合わせが今どきの選択肢です。

関連ツール

このツールは他の言語でも利用できます