JSON을 Java 클래스로

JSON 샘플을 붙여넣으면 알맞은 필드 타입, getter, setter, JSON 라이브러리 애너테이션을 갖춘 하나 이상의 Java 클래스를 생성합니다. 더 깔끔한 코드를 위해 Jackson(@JsonProperty), Gson(@SerializedName), Lombok(@Data/@Builder)을 지원합니다. 중첩된 객체는 선택한 레이아웃에 따라 내부 클래스 또는 형제 클래스가 됩니다.

JSON을 Java로 변환하는 방법

  1. 1

    JSON 붙여넣기

    샘플 하나면 충분합니다. 여러 샘플을 사용하면 null 허용 여부를 더 정확하게 판별할 수 있습니다.

  2. 2

    라이브러리 선택

    Jackson(Spring에서 가장 일반적), Gson(Android 및 일부 레거시 프로젝트), 또는 애너테이션 없는 순수 POJO.

  3. 3

    추가 옵션 선택

    getter/setter 자동 생성, 빌더 패턴, 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>
객체 중첩 클래스

래퍼 타입과 원시 타입 중 선택

  • 원시 타입(int, long, boolean), null 불가, 효율적이며 오토박싱이 없습니다.
  • 래퍼 타입(Integer, Long, Boolean), 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 값으로 처리됩니다.
  • 관련 없는 클래스 간에 래퍼 타입 공유. 두 JSON 구조가 모두 중첩된 Address를 가지면 생성기는 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 없는 생성을 결합하는 것이 현대적인 선택입니다.

관련 도구

이 도구는 다른 언어로도 제공됩니다