왜 만들었나요
API 문서에 적힌 예시 JSON을 보고 모델 클래스를 손으로 옮겨 적는 일이 잦았습니다. 필드가 스무 개 넘어가면 오타 하나 찾느라 시간을 다 쓰게 되더군요. 붙여넣기 한 번으로 클래스 생성이 끝나면 될 일이라 JSON → DTO 변환기를 만들었습니다.
JSON을 붙여넣으면 클래스 코드로 바꿔 줍니다. Python·Java·Kotlin·C#을 지원하고, 반대로 코드를 넣으면 JSON 예시가 만들어집니다.
로딩 중...
API 문서에 적힌 예시 JSON을 보고 모델 클래스를 손으로 옮겨 적는 일이 잦았습니다. 필드가 스무 개 넘어가면 오타 하나 찾느라 시간을 다 쓰게 되더군요. 붙여넣기 한 번으로 클래스 생성이 끝나면 될 일이라 JSON → DTO 변환기를 만들었습니다.
Note
붙여넣은 JSON과 코드는 서버로 전송되지 않습니다. 변환이 전부 브라우저 안에서 이뤄져, 사내 API 규격이나 미공개 데이터 구조도 기기 밖으로 나가지 않습니다.
JSON → DTO 변환기 위쪽 JSON 패널에 데이터를 붙여넣거나 샘플 버튼으로 예제를 불러옵니다.

아래쪽 패널 위에서 Python · Java · Kotlin · C# 중 언어를 고릅니다.

만들어진 클래스 코드를 복사 버튼으로 가져갑니다. 반대로 코드를 직접 고치면 그 구조에 맞는 JSON 예시가 위쪽에 만들어집니다.
주문 응답 JSON을 Kotlin으로 바꾸면 이렇게 나옵니다.
넣은 것 나온 것 (「루트 이름」 칸에 Order 를 넣은 경우)
{ data class Item(
"id": 1, val sku: String
"name": "사과", → )
"items": [ {"sku":"A1"} ]
} data class Order(
val id: Long,
val name: String,
val items: List<Item>
)
중첩된 객체는 자동으로 별도 클래스로 분리되고, 같은 모양의 객체는 하나의 클래스로 재사용됩니다. 안쪽 클래스가 먼저 나오고 최상위 클래스가 마지막에 붙습니다. 「루트 이름」 칸을 비워 두면 최상위 이름은 RootObject 가 됩니다.
같은 JSON을 넣어도 언어별로 만들어지는 코드의 결이 다릅니다.
| 언어 | 나오는 형태 | 필드 한 줄 예시 |
|---|---|---|
| Python | pydantic 의 BaseModel 상속 + import 줄 | name: str |
| Java | 클래스와 private 필드 선언만 | private String name; |
| Kotlin | data class (생성자 파라미터로) | val name: String |
| C# | 클래스와 자동 구현 속성 | public string name { get; set; } |
Java 는 필드 선언까지만 나옵니다. 게터·세터 메서드나 @JsonProperty 같은 어노테이션은 붙지 않으니, 쓰기 전에 프로젝트 규칙대로 채워 넣어야 합니다. C# 은 get; set; 이 함께 나와 그대로 쓰기 쉽습니다. Kotlin 은 data class 라 생성자와 equals 가 언어 차원에서 따라옵니다. import 줄은 필요할 때만 붙습니다. Python 은 List·Optional·Any 중 실제로 쓰인 것만 넣고, Java 는 목록 필드가 있을 때 import java.util.List; 한 줄이 들어갑니다.
| JSON 값 | Python | Java | Kotlin | C# |
|---|---|---|---|---|
"text" | str | String | String | string |
42 | int | long | Long | long |
4.7 | float | double | Double | double |
true | bool | boolean | Boolean | bool |
[ … ] | List[T] | List<T> | List<T> | List<T> |
null·누락 (다른 값이 있을 때) | Optional[…] = None | 박싱 타입 | T? = null | T? |
값이 모두 null | Optional[Any] = None | Object | Any? = null | object? |
필드 이름은 영문·숫자·밑줄로 된 키는 그대로 쓰고, 하이픈·점·한글처럼 변수 이름에 쓸 수 없는 글자는 밑줄로 바뀝니다(숫자로 시작하면 앞에 밑줄이 붙습니다). C# 관례처럼 첫 글자를 대문자로 쓰려면 나온 코드에서 직접 손봐야 합니다.
한글 키는 이름이 남지 않습니다. 이름·주소처럼 두 글자 한글 키는 둘 다 __가 되기 때문에, 같은 클래스에서 겹치면 뒤쪽에 번호를 붙여 __·__2로 구분합니다. 대신 원래 키를 줄 끝 주석으로 남기니 어느 항목인지 보고 이름을 고쳐 쓰면 됩니다.
private String __; // 이름
private Item __2; // 주소
private long user_id; // user-id
객체 배열은 모든 요소의 키를 합쳐서 클래스를 만들고, 일부에만 있는 키는 선택 필드로 처리합니다.
JSON에는 정수와 실수 구분만 있고 크기 정보가 없습니다. 그래서 안전하게 큰 종류(Java·Kotlin은 long·double)로 만듭니다. 값 범위가 작다고 확신하면 코드에서 직접 바꿔 쓰세요.
값이 null이면 원래 어떤 종류였는지 알 수 없습니다. 같은 필드에 값이 든 다른 샘플이 있으면 그 종류를 쓰고, 모든 샘플이 null이면 종류를 추측하지 않고 아무 종류(Java Object, Python Any, Kotlin Any?, C# object?)로 둡니다. 예시 JSON에 실제 값이 든 샘플을 쓰면 정확해집니다.
JSON → DTO 변환기가 만든 코드는 초안으로 쓰고 손보는 것을 권합니다. 필드 이름 규칙, 직렬화 설정, 검증 규칙은 프로젝트마다 다르기 때문입니다. 특히 게터·세터와 직렬화 어노테이션은 만들지 않으므로, 이 둘이 필요한 Java 같은 곳에서는 손으로 채워야 합니다. 옮겨 적는 수고를 덜어 주는 도구로 보시면 됩니다.
데이터를 주고받는 데만 쓰는 클래스입니다. 서버와 앱이 JSON을 주고받을 때, 그 JSON 모양을 코드에서 다루기 쉽게 옮겨 놓은 그릇이라고 보면 됩니다.
JSON 안에 또 다른 객체가 들어 있는 구조입니다. 주문 안에 상품 정보가 통째로 들어가는 식입니다. 코드로 옮길 때는 각각 별도 클래스로 나누는 게 일반적입니다.
Python(pydantic)·Java·Kotlin·C# 네 가지를 지원합니다. 가운데 언어 버튼으로 바꾸면 같은 JSON이 그 언어의 관용적인 클래스 코드로 즉시 다시 그려지고, 오른쪽 패널의 복사 버튼으로 가져갈 수 있습니다.
네. 양방향으로 동작합니다. 왼쪽 JSON을 고치면 오른쪽 클래스 코드가 갱신되고, 반대로 오른쪽 코드에 필드를 추가하거나 이름을 바꾸면 그 구조에 맞는 JSON 샘플이 왼쪽에 다시 만들어집니다. 샘플 값은 문자열이면 "string", 숫자면 0처럼 형식별 예시 값으로 채워집니다.
위쪽 "루트 이름" 칸에 원하는 이름을 넣으면 그 이름이 가장 바깥 클래스에 붙습니다(비워 두면 RootObject). 중첩된 객체는 그 키 이름을 대문자 표기로 바꿔 별도 클래스가 되고, 배열이면 복수형을 단수로 바꿔 이름을 만듭니다(items → Item).
해당 언어에서 변수 이름으로 쓸 수 없는 문자는 밑줄(_)로 바꿔 코드를 만듭니다. 숫자로 시작하는 키에는 앞에 밑줄을 붙입니다. 그대로 써도 되는 키는 원본을 유지하므로, JSON과 코드를 오가도 이름이 어긋나지 않습니다.
전송되지 않습니다. 변환이 전부 브라우저 안에서 이뤄지고 어디에도 저장되지 않아, 사내 API 응답 예시나 공개되지 않은 데이터 구조도 안심하고 붙여넣을 수 있습니다.
마지막 업데이트: