JSON → Java POJO

JSONからJava POJOクラスを即座に生成。Jackson・Gson・Lombokアノテーション対応。ネストオブジェクト・配列・カスタムルートクラス名に対応。無料、ブラウザ内で処理。

  • ブラウザ内で処理
  • データはブラウザ外に出ません
  • 無料 · 登録不要
空欄では RootObject を使います。名前を変更すると、300 ミリ秒後に再生成します。
アノテーション なし、Jackson、Gson、Lombok (@Data) から選択します。アノテーションを変えると、すぐに再生成します。
JSON を、ネストされたオブジェクト、配列、null を含むサンプルに置き換え、現在の設定ですぐに生成します。
JSON、出力、ステータスを消去し、ルート名と選択したモードを保持します。ツール内で Ctrl/⌘+L を押すとルート名も消去します。
コメントや末尾のカンマを含まない有効な JSON を入力します。入力を止めてから 300 ミリ秒後に生成します。無効な JSON では出力を消去し、エラーを表示します。
Java 出力
表示中の Java 出力を全文コピーします。出力が空の場合はコピーしません。

JSON を入力するかサンプルを読み込むと、Java を生成します。

例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。

型マッピング

  • null → Object
  • 文字列 → String
  • 整数 → int(int の範囲を超える値は long)
  • 浮動小数点数 → double
  • 真偽値 → boolean
  • 配列 → List<T>
  • ネストオブジェクト → 独立した public class

例

以下のJSONを入力した場合:

{"user": {"first_name": "Alice", "age": 30}, "tags": ["admin"]}

Lombokモードで生成される出力:

import java.util.List;
import lombok.Data;

@Data
public class RootObject {
    private User user;
    private List<String> tags;
}

@Data
public class User {
    private String firstName;
    private int age;
}

例:明細を含む注文(Jackson モード)

入力:

{"order_id": 9007, "customer": {"name": "Alice", "vip": true}, "items": [{"sku": "A-1", "qty": 2, "price": 9.5}, {"sku": "B-2", "qty": 1, "price": 20}], "note": null}

出力(getter / setter は省略):

import java.util.List;
import com.fasterxml.jackson.annotation.JsonProperty;

public class RootObject {
  @JsonProperty("order_id")
  private int orderId;
  private Customer customer;
  private List<ItemsItem> items;
  private Object note;
  // getters and setters omitted here
}

public class Customer {
  private String name;
  private boolean vip;
  // ...
}

public class ItemsItem {
  private String sku;
  private int qty;
  private double price;
  // ...
}

この出力は 1 ファイルのままではコンパイルできません。public class は同名のファイルに置く必要があるため、RootObject.java・Customer.java・ItemsItem.java に分けます。分けると「アノテーションなし」モードの出力は javac 21 でそのままコンパイルできます。

生成後に確認すること

  • price は double です。1 件目は 9.5、2 件目は 20 で、ツールは int と double を広い方の double にまとめます。金額なら BigDecimal に直してください。
  • サンプル中の null は Object になります。実際の型に置き換えます。
  • int の範囲を超える整数(ミリ秒のタイムスタンプ 1730000000000 など)は long になります。サンプルの値が小さくても将来大きくなる ID は、自分で long にします。
  • Lombok モードは @JsonProperty を付けないため、order_id が orderId に対応しなくなります:
import java.util.List;
import lombok.Data;

@Data
public class RootObject {
  private int orderId;
  private Customer customer;
  private List<ItemsItem> items;
  private Object note;
}

Lombok モードでは @JsonProperty を自分で付けるか、Jackson に PropertyNamingStrategies.SNAKE_CASE を設定します。Gson モードは同じ目的で @SerializedName を使います。

Jackson での読み込み:

ObjectMapper mapper = new ObjectMapper();
RootObject order = mapper.readValue(json, RootObject.class);

Java 16 以降なら、小さな不変モデルはクラスの代わりに record にできます。Jackson は 2.12 から record を読めます:

public record Customer(String name, boolean vip) {}

例:同じキーで構造が違う場合と、Java の名前にできないキー(Jackson モード)

{"billing": {"address": {"city": "Paris"}}, "shipping": {"address": {"line1": "1 Main St"}}, "class": "A", "2fa": true, "URL": "https://example.com"}

出力(getter / setter の大部分は省略):

import com.fasterxml.jackson.annotation.JsonProperty;

public class RootObject {
  private Billing billing;
  private Shipping shipping;
  @JsonProperty("class")
  private String classValue;
  @JsonProperty("2fa")
  private boolean t2fa;
  @JsonProperty("URL")
  private String uRL;

  @JsonProperty("URL")
  public String getURL() {
  // 残りの getter / setter は省略
}

public class Address {
  private String city;
  // ...
}

public class ShippingAddress {
  private String line1;
  // ...
}
  • 2 つの address はフィールドが違うので、2 つ目は親の名前を前に付けます(ShippingAddress)。フィールドと型が同じオブジェクトは 1 つのクラスを共有します。前置きしても名前が重なるときは番号を付けます。
  • Java のキーワードとリテラルには Value を付け(class → classValue)、数字で始まる名前には T を付け(2fa → t2fa)、同じ名前になるキーには番号を付けます(first-name と first_name → firstName と firstName2)。元のキーはアノテーションに残ります。
  • Jackson は getURL() を uRL ではなく url と読みます。getter と setter にアノテーションがないと別のプロパティができ、URL を読むときにエラーになります。Gson はフィールドだけを読むので不要です。

ツールのテストでは javac 21、Jackson 2.17.2、Gson 2.11.0 で Jackson / Gson の各出力をコンパイルし、サンプルを読み込んで書き戻すと元の JSON と一致します。Lombok 1.18.34 の各出力もコンパイルできます。

制限

  • なし・Lombok モードは Java の名前しか持ちません。この 2 つでは classValue・t2fa は class・2fa に対応しません。キーが Java の名前として使えないときは Jackson か Gson モードを使ってください。
  • Jackson は空のキーを書き出せません。@JsonProperty("") は「既定の名前を使う」という意味なので、キー "" には @JsonAlias("") とコメントを出力します。Jackson は {"": 4} を読めますが、書き戻すと {"t": 4} になります。Gson モードは @SerializedName("") で空のキーを保ちます。

FAQ

このツールは何を生成しますか?

JSONからJava POJO(Plain Old Java Object)クラスを生成します。ネストオブジェクトはそれぞれ独立したpublicクラスになり、プライベートフィールドとgetter/setterメソッドを含みます(Lombokモードでは@Dataを使用)。

どのアノテーションモードに対応していますか?

4つのモード:なし(純粋なPOJO、getter/setter付き)、Jackson(@JsonProperty)、Gson(@SerializedName)、Lombok(@Data)。Jackson・Gson モードは JSON キーとフィールド名が違うときにフィールドへアノテーションを付けます。Jackson が getter / setter から導く名前がフィールド名と違うとき(getURL は url と読まれる)、Jackson モードは getter と setter にも付けます。なし・Lombok モードは元のキーを保持しません。

JSONの型はJavaの型にどのようにマッピングされますか?

string→String、integer→int(int の範囲外は long)、float/double→double、boolean→boolean、null→Object、array→List<T>、ネストオブジェクト→独立クラス。

Listのインポートはいつ追加されますか?

配列フィールドが存在する場合、import java.util.Listが自動的に追加されます。

データはサーバーに送信されますか?

いいえ。変換処理はすべてブラウザ内で実行されます。データは外部に送信されません。