JSON do Java

Generuj klasy Java POJO z JSON

Wypróbuj przykład
Nazwa głównej klasy:

Wejście JSON

Wyjście Java

Działa lokalnie · Bezpieczne do wklejania sekretów
Klasy Java pojawią się tutaj…

Czym jest konwersja JSON do klas Java?

Konwersja JSON do klas Java polega na przekształceniu surowego obiektu JSON w definicje Plain Old Java Object (POJO) z prywatnymi polami, getterami i setterami. Java nie ma wbudowanego systemu typów JSON, więc każda odpowiedź API, plik konfiguracyjny lub ładunek wiadomości wymaga odpowiedniej klasy, zanim będzie można bezpiecznie typowo z nim pracować. Biblioteki takie jak Jackson i Gson mapują klucze JSON na pola Java za pomocą refleksji, ale wymagają do tego wcześniej istniejących definicji klas.

Standardowy Java POJO do deserializacji JSON deklaruje prywatne pole dla każdego klucza JSON, konstruktor bezargumentowy oraz parę getter/setter dla każdego pola. Zagnieżdżone obiekty JSON stają się osobnymi klasami. Tablice stają się polami List<T> z importem java.util.List. Prymitywne typy JSON mapują się na prymitywy Java (int, double, boolean) lub ich typy opakowań (Integer, Double, Boolean) używane wewnątrz generyków. Wartości null typowo mapują się na Object lub typ referencyjny dopuszczający null.

Ręczne pisanie tych definicji klas jest powtarzalne. Trzeba odczytać każdy klucz JSON, określić typ Java na podstawie wartości, przekonwertować konwencje nazewnicze z camelCase JSON na camelCase pól Java, stworzyć nazwy klas w PascalCase dla zagnieżdżonych obiektów i dodać szablon getterów/setterów. Dla obiektu JSON z 15 polami i 3 zagnieżdżonymi obiektami oznacza to napisanie 4 klas, ponad 30 metod i zachowanie spójności w całym kodzie. Konwerter robi to w milisekundy.

Dlaczego warto używać konwertera JSON do Java?

Ręczne tworzenie Java POJO z JSON wymaga sprawdzania każdego pola, wnioskowania typów z przykładowych wartości, pisania par getter/setter i powtarzania tego procesu dla każdego zagnieżdżonego obiektu. Gdy kontrakt API się zmienia, wszystko aktualizujesz ręcznie. Konwerter eliminuje tę mechaniczną pracę.

Natychmiastowe generowanie POJO
Wklej swój JSON i otrzymaj kompletne definicje klas Java w mniej niż sekundę. Zagnieżdżone obiekty, listy i typy proste są wykrywane i mapowane automatycznie.
🔒
Przetwarzanie z zachowaniem prywatności
Konwersja odbywa się całkowicie w przeglądarce za pomocą JavaScript. Twoje dane JSON nigdy nie opuszczają Twojego urządzenia. Klucze API, tokeny i dane produkcyjne pozostają prywatne.
📝
Poprawne wnioskowanie typów
Każde wygenerowane pole używa odpowiedniego typu Java wywnioskowanego z wartości JSON: String, int, double, boolean, List<T> lub Object dla wartości null. Typy opakowań są używane wewnątrz generyków.
📦
Bez instalacji i rejestracji
Otwórz stronę i wklej swój JSON. Żadnego JDK, żadnych zależności Maven, żadnego konta. Działa na każdym urządzeniu z przeglądarką.

Przypadki użycia JSON do Java

Tworzenie API w Spring Boot
Generuj DTO żądań i odpowiedzi z przykładowych danych JSON API. Wklej oczekiwany kształt ładunku i otrzymaj klasy Java gotowe do adnotacji @RequestBody i @ResponseBody w kontrolerach Spring.
Tworzenie aplikacji Android
Twórz klasy modeli dla odpowiedzi sieciowych Retrofit lub Volley. Wklej JSON zwracany przez Twoje API backendowe i otrzymaj POJO kompatybilne z konwerterami Gson lub Moshi.
Integracja mikroserwisów
Definiuj typowane klasy wiadomości dla ładunków JSON Kafka, RabbitMQ lub gRPC. Wklej przykładową wiadomość i wygeneruj POJO dokumentujące oczekiwany kontrakt między serwisami.
Migracja systemów dziedzicznych
Konwertuj odpowiedzi JSON API na klasy Java przy opakowywaniu endpointów REST w typowanego klienta. Przydatne przy migracji z luźno typowanych wzorców Map<String, Object> do właściwych modeli domenowych.
QA i automatyzacja testów
Buduj typowane dane testowe z przykładów odpowiedzi API. Inżynierowie QA mogą wklejać rzeczywiste odpowiedzi JSON i tworzyć definicje POJO do użycia w zestawach testów JUnit lub TestNG z asercjami AssertJ.
Nauka wzorców OOP w Java
Studenci mogą wkleić dowolną strukturę JSON i zobaczyć, jak Java reprezentuje ją za pomocą klas, pól, getterów, setterów i typów zagnieżdżonych. Wynik czyni to konkretnym, a nie abstrakcyjnym.

Tabela mapowania typów JSON do Java

Każda wartość JSON mapuje się na konkretny typ Java. Poniższa tabela pokazuje, jak konwerter przekształca każdy typ JSON na odpowiednik Java. Kolumna Alternatywa pokazuje typy opakowań używane w kontekstach generycznych jak List<T> lub nowsze funkcje Java, takie jak Records.

Typ JSONPrzykładTyp JavaAlternatywa
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>

Adnotacje Java JSON — przewodnik

Przy deserializacji JSON za pomocą Jackson lub Gson adnotacje kontrolują sposób mapowania kluczy JSON na pola Java, obsługę nieznanych pól oraz traktowanie wartości null. Ten przewodnik obejmuje adnotacje, które najczęściej napotkasz przy pracy z wygenerowanymi POJO.

AdnotacjaZastosowanieBiblioteka
@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 a Record a Lombok

Java oferuje trzy popularne podejścia do definiowania typowanych struktur przechowujących dane JSON. Każde pasuje do innego stylu projektu i wersji Java. POJO to tradycyjny wzorzec o najszerszej kompatybilności. Records redukują szablon kodu dla niezmiennych danych. Lombok generuje gettery, settery i konstruktory w czasie kompilacji za pomocą adnotacji.

POJO
Tradycyjny wzorzec Java. Działa z Java 8+. Definiujesz prywatne pola oraz metody getter/setter. Pełna kontrola nad zmiennością i niestandardową logiką. Kompatybilny z każdą biblioteką JSON (Jackson, Gson, Moshi). Standardowy wybór dla Spring Boot, Androida i dużych projektów enterprise.
Record (Java 16+)
Wbudowany od Java 16 (podgląd w 14). Zwięzła składnia: record User(int id, String name) generuje konstruktor, akcesory, equals, hashCode i toString. Instancje są niezmienne. Jackson obsługuje records od wersji 2.12. Najlepszy dla obiektów wartości i DTO, gdzie nie potrzebujesz setterów.
Lombok @Data
Zewnętrzny procesor adnotacji działający w czasie kompilacji. @Data generuje gettery, settery, equals, hashCode i toString. @Builder dodaje wzorzec budowniczego. Redukuje szablon kodu do poziomu zbliżonego do records, zachowując zmienność. Wymaga dodania Lombok do narzędzia budowania (Maven/Gradle) i wtyczki IDE.

Przykłady kodu

Te przykłady pokazują, jak używać wygenerowanych Java POJO z Jackson do deserializacji, jak programowo generować klasy Java z JavaScript i Python oraz jak używać narzędzia CLI jsonschema2pojo do generowania wsadowego.

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

Często zadawane pytania

Jaka jest różnica między POJO a Java Bean?
POJO (Plain Old Java Object) to prosta klasa Java bez zależności od frameworka. Java Bean to POJO przestrzegające określonych konwencji: konstruktor bezargumentowy, prywatne pola z publicznymi getterami i setterami oraz implementacja Serializable. Do mapowania JSON większość bibliotek wymaga konwencji Bean (gettery/settery), ale nie wymaga Serializable. Klasy generowane przez to narzędzie stosują wzorzec getter/setter zgodny z Bean.
Której biblioteki JSON użyć z wygenerowanymi POJO?
Jackson (com.fasterxml.jackson) jest najszerzej stosowaną biblioteką Java JSON i domyślną w Spring Boot. Gson (com.google.gson) jest popularny w projektach Android i ma prostsze API. Moshi to nowsza alternatywa od Square, zaprojektowana z myślą o współpracy z Kotlin. Wszystkie trzy działają ze standardowymi POJO mającymi gettery i settery.
Jak konwerter obsługuje zagnieżdżone obiekty JSON?
Każdy zagnieżdżony obiekt staje się osobną klasą Java. Jeśli pole JSON o nazwie "address" zawiera obiekt z kluczami "street" i "city", konwerter tworzy klasę Address z tymi polami i typuje pole nadrzędne jako Address. Głęboko zagnieżdżone struktury generują wiele definicji klas.
Co się dzieje, gdy pole JSON ma wartość null?
Pola null są typowane jako Object, ponieważ konwerter nie może wywnioskować zamierzonego typu wyłącznie z wartości null. W praktyce należy zastąpić Object oczekiwanym typem (String, Integer itp.) po poznaniu kontraktu API. Przy użyciu Jackson wartości null są domyślnie przypisywane do pól typu referencyjnego bez błędów.
Czy powinienem używać Java Records zamiast POJO dla JSON?
Records sprawdzają się dobrze dla niezmiennych obiektów transferu danych, gdzie nie potrzebujesz setterów. Jackson obsługuje records od wersji 2.12, a Gson dodał wsparcie w późniejszych wydaniach. Jeśli Twój projekt działa na Java 16+ i traktujesz odpowiedzi API jako dane tylko do odczytu, records redukują szablon kodu. Jeśli potrzebujesz zmienności lub celujesz w Java 8/11, pozostań przy POJO.
Jak obsługiwać klucze JSON, które nie są prawidłowymi identyfikatorami Java?
Klucze JSON takie jak "first-name" lub "2nd_place" nie są prawidłowymi nazwami pól Java. Użyj @JsonProperty("first-name") w Jackson lub @SerializedName("first-name") w Gson, aby zmapować klucz JSON na prawidłową nazwę pola Java, taką jak firstName. Konwerter automatycznie przekształca nazwy kluczy na pola Java w camelCase.
Czy mogę generować klasy Java ze schematu JSON zamiast z przykładu danych?
To narzędzie generuje klasy z przykładów danych JSON. Dla danych wejściowych w formacie JSON Schema użyj projektu jsonschema2pojo (dostępnego jako narzędzie CLI, wtyczka Maven i wtyczka Gradle). Odczytuje plik JSON Schema i generuje adnotowane klasy Java z ograniczeniami walidacji, wartościami domyślnymi i dokumentacją z opisów schematu.