JSON na klasę Java

Wklej przykładowy JSON, a generator utworzy jedną lub więcej klas Java z właściwymi typami pól, getterami, setterami oraz anotacjami biblioteki JSON. Obsługuje Jackson (@JsonProperty), Gson (@SerializedName) i Lombok (@Data/@Builder) dla czystszego kodu. Obiekty zagnieżdżone stają się klasami wewnętrznymi lub klasami rodzeństwa, zależnie od wybranego układu.

Jak przekonwertować JSON na Java

  1. 1

    Wklej JSON

    Wystarczy jedna próbka; wiele próbek poprawia wykrywanie, czy pole może przyjmować wartość null.

  2. 2

    Wybierz bibliotekę

    Jackson (najczęstszy w Spring), Gson (dla Androida i niektórych starszych projektów) lub zwykłe POJO bez anotacji.

  3. 3

    Wybierz opcje dodatkowe

    Lombok do automatycznego generowania getterów/setterów, wzorca builder oraz equals/hashCode. Albo zostaw kod prosty.

  4. 4

    Wybierz styl zagnieżdżenia

    Klasy rodzeństwa w tym samym pliku (klasy publiczne w Java 17+ muszą być w osobnych plikach) lub zagnieżdżone klasy statyczne.

  5. 5

    Skopiuj kod

    Wklej go do swojego projektu. Nazwy klas odpowiadają kluczom JSON; pakiet jest ustawiany zgodnie z Twoją konfiguracją.

Przykładowe wyjście: Jackson + Lombok

Wejście:

{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }

Wyjście:

@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;
}

Mapowanie typów

JSON Typ w Java
ciąg znaków String
liczba całkowita (≤ Integer.MAX) Integer / int
duża liczba całkowita Long / BigInteger
liczba dziesiętna Double / BigDecimal
wartość logiczna Boolean / boolean
data ISO LocalDate (Jackson JSR-310)
data i godzina ISO Instant / OffsetDateTime
null (przy niepustym polu rodzeństwa) Typ opakowujący (np. Integer)
tablica List<T>
obiekt klasa zagnieżdżona

Wybór między typem opakowującym a prymitywnym

  • Typ prymitywny (int, long, boolean), nie może być null, wydajny, bez auto-boxingu.
  • Typ opakowujący (Integer, Long, Boolean), może być null; wymagany, gdy pole może być nieobecne lub null w JSON.

Domyślnie generator stosuje typ opakowujący dla wszystkiego, co uznaje za mogące być null, a w pozostałych przypadkach typ prymitywny.

Jackson kontra Gson

Funkcja Jackson Gson
Powszechność w Spring Tak, domyślny Nie (wymaga konfiguracji)
Wydajność Szybszy Wolniejszy
Obsługa dat JSR-310 Przez dodatkowy moduł Przez dodatkowy moduł
Polimorfizm @JsonTypeInfo RuntimeTypeAdapter
Tolerancja końcowego przecinka Nie (domyślnie) Tak

Częste błędy

  • Używanie typów prymitywnych dla pól mogących być null. int nie może być null; Jackson zgłosi błąd, jeśli JSON zawiera "age": null. Użyj Integer.
  • Brak modułów dat. Jackson wymaga jackson-datatype-jsr310 dla Instant/LocalDate. Bez niego daty wracają do String lub wartości long w formacie epoch.
  • Współdzielenie typów opakowujących między niepowiązanymi klasami. Jeśli dwie struktury JSON mają zagnieżdżony Address, generator tworzy dwie klasy Address. Zmień nazwy lub scal je ręcznie.
  • Pominięcie @JsonIgnoreProperties(ignoreUnknown = true). Rygorystyczny Jackson zgłasza błąd przy nieznanych właściwościach; dodaj tę anotację (lub skonfiguruj ją globalnie), aby uzyskać tolerancyjną deserializację.

Najczęściej zadawane pytania

W większości przypadków Jackson, jest domyślny w Spring, szybszy i ma bogatszą obsługę polimorfizmu. Gson jest lżejszy i lepiej znany w Androidzie, choć projekty Androida coraz częściej korzystają z Moshi lub kotlinx.serialization.

Lombok usuwa wiele powtarzalnego kodu (gettery, settery, equals, hashCode, builder). Jest szeroko stosowany, ale wymaga procesora anotacji Lombok w procesie budowania. Wyłącz go, jeśli Twój projekt unika Lombok ze względu na higienę zależności.

Pola, które są null w którejkolwiek z obserwowanych próbek, stają się typami opakowującymi (Integer zamiast int), aby mogły przechowywać null. Jackson wtedy bezbłędnie deserializuje "age": null. Dodaj @JsonInclude(Include.NON_NULL), aby pomijać wartości null podczas serializacji.

Tak, jeśli wybierzesz „record“. Rekordy są zwięzłe, niezmienne i działają z Jackson 2.12+. W projektach opartych na Spring Boot 3 połączenie rekordów z generowaniem bez Lombok to nowoczesny wybór.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach