본문으로 건너뛰기

JSON을 Kotlin 데이터 클래스로 변환 — Numio

JSON 샘플로 Kotlin data class를 생성합니다. 정수는 Long, 소수는 Double이 되고, 중첩 객체는 각각 별도 클래스가 되며, 배열의 일부 항목에만 있는 키는 Boolean? 같은 nullable 타입이 됩니다.

Jackson으로 JSON을 파싱하는 Android 앱용 REST 응답을 모델링합니다.

JSON

이럴 때 사용하세요

  • Jackson으로 JSON을 파싱하는 Android 앱용 REST 응답을 모델링합니다.
  • 예시 페이로드로 Ktor 또는 Spring Boot 서비스의 DTO를 만듭니다.

사용 방법

  1. 대표적인 JSON 객체나 배열을 JSON 편집기에 붙여 넣습니다. 선택적 키가 드러나는 배열 항목도 포함하세요.
  2. Kotlin 패널을 확인합니다. 최상위 클래스 이름은 Root이고 중첩 클래스는 키 이름을 따릅니다(projects는 Project가 됨).
  3. 클래스를 복사해 Root 이름을 바꾸고, API 계약에 맞게 Any?나 Long을 바꿉니다.

JSON 입력

{
  "id": 1024,
  "full_name": "Ada Lovelace",
  "email": null,
  "roles": ["admin", "editor"],
  "projects": [
    { "name": "Engine", "stars": 42 },
    { "name": "Notes", "stars": 7, "archived": true }
  ]
}

Kotlin data class

import com.fasterxml.jackson.annotation.JsonProperty

data class Root(
    val id: Long,
    @JsonProperty("full_name")
    val fullName: String,
    val email: Any?,
    val roles: List<String>,
    val projects: List<Project>,
)

data class Project(
    val name: String,
    val stars: Long,
    val archived: Boolean?,
)

세부 정보 및 제한 사항

변환은 브라우저에서 json_typegen WebAssembly 모듈로 실행되며 JSON은 업로드되지 않습니다. 이 페이지에는 설정이 없습니다.

camelCase가 아닌 키에는 Jackson @JsonProperty 어노테이션과 import com.fasterxml.jackson.annotation.JsonProperty가 붙습니다. kotlinx.serialization이나 Moshi 어노테이션은 생성되지 않습니다.

null 값과 빈 배열은 타입 정보가 없으므로 Any?와 List<Any?>가 됩니다.

nullable 필드에는 기본값(= null)이 없습니다. 역직렬화할 때 필드가 없을 수 있다면 기본값을 직접 추가하세요.

FAQ

정수 타입이 Int가 아니라 Long인 이유는 무엇인가요?

큰 ID가 오버플로되지 않도록 생성기는 정수에 항상 Long을 사용합니다. 64비트 정수 범위를 넘거나 소수점이 있는 숫자는 Double이 됩니다.

루트가 배열인 JSON도 변환할 수 있나요?

예. 루트 배열은 typealias Root = List<Root2>; 같은 typealias와 요소 타입용 data class Root2를 만듭니다. 코드에 맞게 둘 다 이름을 바꾸세요.

짧은 혼합 배열이 Pair<Long, String>이 된 이유는 무엇인가요?

json_typegen은 항목 타입이 서로 다른 짧은 배열을 튜플로 취급하므로 [1, "a"]는 Pair<Long, String>이 됩니다. 실제로 리스트라면 List<Any>로 바꾸세요.

사양 및 참고 자료