JSONからJavaクラス変換

JSONからJava POJOクラスを自動生成

サンプルを試す
ルートクラス名:

JSON入力

Java出力

ローカルで実行 · シークレットの貼り付けも安全
Javaクラスがここに表示されます…

JSONからJavaクラスへの変換とは?

JSONからJavaクラスへの変換は、生のJSONオブジェクトからPlain Old Java Object(POJO)定義を生成するプロセスです。生成されるPOJOはプライベートフィールド、getter、setterを持ちます。Javaには組み込みのJSON型システムがないため、JSON APIのレスポンス・設定ファイル・メッセージペイロードをタイプセーフに扱うには、事前に対応するクラス定義が必要です。JacksonやGsonはリフレクションを使ってJSONキーをJavaフィールドにマッピングしますが、いずれもクラス定義が先に存在していることを前提としています。

JSON逆シリアル化用の標準的なJava POJOは、各JSONキーに対するプライベートフィールド、引数なしコンストラクター、フィールドごとのgetter/setterペアを宣言します。ネストされたJSONオブジェクトは別々のクラスになります。配列はjava.util.ListをインポートしたList<T>フィールドになります。プリミティブなJSON型はJavaのプリミティブ型(int、double、boolean)か、ジェネリクス内ではラッパー型(Integer、Double、Boolean)にマッピングされます。null値は通常Objectまたはnullableな参照型にマッピングされます。

これらのクラス定義を手書きするのは繰り返し作業です。各JSONキーを読み取り、値からJavaの型を判断し、命名規則をcamelCaseのJSONからcamelCaseのJavaフィールドに変換し、ネストされたオブジェクトにはPascalCaseのクラス名を付け、getter/setterのボイラープレートを追加する必要があります。フィールドが15個・ネストされたオブジェクトが3つあるJSONオブジェクトなら、4つのクラスと30以上のメソッドを書いてすべての整合性を保つ必要があります。変換ツールはこの作業をミリ秒で完了します。

JSONからJava変換ツールを使う理由

JSONからJava POJOを手動で作成するには、各フィールドの検査・サンプル値からの型推論・getter/setterペアの記述を、ネストされたオブジェクトごとに繰り返す必要があります。APIの仕様が変わればすべて手作業で更新しなければなりません。変換ツールはその機械的な作業を排除します。

即座にPOJOを生成
JSONを貼り付けるだけで、1秒以内に完全なJavaクラス定義が得られます。ネストされたオブジェクト・リスト・プリミティブ型は自動的に検出してマッピングされます。
🔒
プライバシーファーストな処理
変換はすべてブラウザ上でJavaScriptを使って実行されます。JSONデータがマシンの外に出ることはありません。APIキー・トークン・本番データはプライベートのままです。
📝
正確な型推論
生成されるすべてのフィールドは、JSONの値から推論された適切なJava型を使用します:String、int、double、boolean、List<T>、またはnull用のObject。ラッパー型はジェネリクス内で使用されます。
📦
インストール・サインアップ不要
ページを開いてJSONを貼り付けるだけです。JDKもMavenの依存関係もアカウントも不要です。ブラウザがあればどのデバイスでも動作します。

JSONからJava変換のユースケース

Spring Boot API開発
APIのJSONサンプルからリクエスト・レスポンスのDTOを生成します。期待するペイロードの形状を貼り付ければ、SpringコントローラーのREquestBodyおよびResponseBodyアノテーションに対応したJavaクラスをすぐに取得できます。
Androidアプリ開発
RetrofitまたはVolleyのネットワークレスポンス用モデルクラスを作成します。バックエンドAPIが返すJSONを貼り付けて、GsonまたはMoshiコンバーターに対応したPOJOを取得できます。
マイクロサービス連携
Kafka・RabbitMQ・gRPCのJSONペイロード用に型付きメッセージクラスを定義します。サンプルメッセージを貼り付けて、サービス間の期待されるコントラクトを文書化するPOJOを生成します。
レガシーシステムの移行
RESTエンドポイントを型付きクライアントでラップする際に、JSON APIのレスポンスをJavaクラスに変換します。Map<String, Object>の緩い型パターンから適切なドメインモデルへの移行時に有用です。
QAとテスト自動化
APIレスポンスのサンプルから型付きテストフィクスチャを構築します。QAエンジニアは実際のJSONレスポンスを貼り付けて、AssertJのアサーションを使ったJUnitまたはTestNGのテストスイート用にPOJO定義を生成できます。
JavaのOOPパターンを学ぶ
学習者は任意のJSON構造を貼り付けて、Javaがそれをクラス・フィールド・getter・setter・ネストされた型でどのように表現するかを確認できます。出力により抽象的な概念が具体的になります。

JSONからJavaへの型マッピング

すべてのJSON値は特定のJava型にマッピングされます。下表は変換ツールが各JSON型をどのようにJavaの対応型に変換するかを示しています。「代替」列にはList<T>のようなジェネリクスのコンテキストで使用されるラッパー型や、RecordなどJavaの新しい機能が示されています。

JSON型値の例Java型代替
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

Java JSONアノテーションリファレンス

JacksonまたはGsonでJSONを逆シリアル化する際、アノテーションはJSONキーのJavaフィールドへのマッピング・未知フィールドの処理・null値の扱い方を制御します。このリファレンスは生成されたPOJOを使用する際によく使われるアノテーションをまとめています。

アノテーション用途ライブラリ
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO vs Record vs Lombok

Javaにはゃ型付き構造を定義してJSONデータを保持する一般的なアプローチが3つあります。それぞれプロジェクトのスタイルとJavaのバージョンに応じて適した選択肢があります。POJOは最も広い互換性を持つ従来のパターンです。Recordはイミュータブルなデータのボイラープレートを削減します。Lombokはアノテーションを通じてコンパイル時にgetter・setter・コンストラクターを生成します。

POJO
Javaの従来のパターン。Java 8以降で動作します。プライベートフィールドとgetter/setterメソッドを定義します。可変性とカスタムロジックを完全に制御できます。すべてのJSONライブラリ(Jackson・Gson・Moshi)に対応しており、Spring Boot・Android・エンタープライズコードベースにおける標準的な選択肢です。
Record (Java 16+)
Java 16から標準搭載(14ではプレビュー)。コンパクトな構文:record User(int id, String name) とするだけでコンストラクター・アクセサー・equals・hashCode・toStringが自動生成されます。インスタンスはイミュータブルです。Jacksonはバージョン2.12からRecordをサポートしています。setterが不要な値オブジェクトやDTOに最適です。
Lombok @Data
サードパーティのコンパイル時アノテーションプロセッサー。@Dataはgetter・setter・equals・hashCode・toStringを生成します。@Builderはビルダーパターンを追加します。可変性を保ちながらボイラープレートをRecordに近いレベルまで削減できます。ビルドツール(Maven/Gradle)へのLombokの追加とIDEプラグインが必要です。

コード例

以下の例は、生成されたJava POJOをJacksonを使って逆シリアル化する方法、JavaScriptとPythonからプログラムでJavaクラスを生成する方法、そしてバッチ生成にjsonschema2pojo CLIツールを使用する方法を示しています。

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

よくある質問

POJOとJava Beanの違いは何ですか?
POJO(Plain Old Java Object)はフレームワークへの依存がないシンプルなJavaクラスです。Java BeanはPOJOの一種で、引数なしコンストラクター・privateフィールドに対するpublicなgetter/setter・Serializableの実装という特定の規約に従います。JSONマッピングにおいて、ほとんどのライブラリはBean規約(getter/setter)を必要としますが、Serializableは必須ではありません。このツールが生成するクラスはBeanのgetter/setterパターンに従っています。
生成されたPOJOにはどのJSONライブラリを使うべきですか?
Jackson(com.fasterxml.jackson)はJavaで最も広く使われているJSONライブラリであり、Spring Bootのデフォルトでもあります。Gson(com.google.gson)はAndroidプロジェクトで人気があり、よりシンプルなAPIを持ちます。Moshiはいずれも標準的なgetter/setterを持つPOJOで動作します。
変換ツールはネストされたJSONオブジェクトをどのように処理しますか?
ネストされたオブジェクトはそれぞれ別のJavaクラスになります。"address"というJSONフィールドが"street"と"city"キーを持つオブジェクトを含む場合、変換ツールはそれらのフィールドを持つAddressクラスを作成し、親フィールドの型をAddressとします。深くネストされた構造からは複数のクラス定義が生成されます。
JSONフィールドがnullの場合はどうなりますか?
null値のフィールドはObjectとして型付けされます。null値だけからは意図する型を推論できないためです。実際には、APIの仕様を把握した上でObjectを期待する型(StringやIntegerなど)に置き換えます。Jacksonを使用している場合、null値はデフォルトでエラーなく参照型フィールドに代入されます。
JSONにPOJOの代わりにJava Recordを使うべきですか?
Recordは、setterが不要なイミュータブルなデータ転送オブジェクトに適しています。Jacksonはバージョン2.12からRecordをサポートしており、Gsonも後のリリースでサポートを追加しました。プロジェクトがJava 16以降で動作し、APIレスポンスを読み取り専用データとして扱う場合、Recordによりボイラープレートが削減されます。可変性が必要な場合やJava 8/11を対象とする場合はPOJOを使用してください。
Javaの識別子として有効でないJSONキーはどう処理しますか?
"first-name"や"2nd_place"のようなJSONキーは有効なJavaフィールド名ではありません。JacksonではrequestBody@JsonProperty("first-name")を、GsonではSerializedName("first-name")を使って、JSONキーをfirstNameのような有効なJavaフィールド名にマッピングします。変換ツールはキー名を自動的にcamelCaseのJavaフィールドに変換します。
JSONサンプルではなくJSON SchemaからJavaクラスを生成できますか?
このツールはJSONデータサンプルからクラスを生成します。JSON Schemaを入力とする場合は、jsonschema2pojoプロジェクト(CLIツール・Mavenプラグイン・Gradleプラグインとして利用可能)を使用してください。JSON Schemaファイルを読み込み、スキーマの説明からバリデーション制約・デフォルト値・ドキュメントを持つアノテーション付きJavaクラスを生成します。