JSON to Python Dataclass 생성기

JSON에서 Python dataclass 생성

예시 시도
루트 클래스 이름:

JSON 입력

Python 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
Python dataclass가 여기에 표시됩니다…

JSON to Python Dataclass 변환이란?

JSON to Python dataclass 변환은 원시 JSON 객체를 받아 정확한 타입 어노테이션이 포함된 Python dataclass 정의 세트를 생성합니다. PEP 557(Python 3.7)에서 도입된 Python의 dataclasses 모듈은 어노테이션이 달린 클래스 필드에서 __init__, __repr__, __eq__ 메서드를 자동으로 생성합니다. JSON API, 설정 파일, 메시지 큐를 다룰 때 dataclass는 데이터에 타입이 있는 구조를 부여하여 에디터와 mypy 같은 타입 검사기가 개발 시점에 검증할 수 있게 합니다.

Python의 json.loads()는 일반 dict와 list를 반환합니다. 이것도 동작하지만 타입 정보가 없습니다. 오타가 있는 키는 오류를 발생시키는 대신 None을 반환하고, 에디터는 필드 이름을 자동 완성할 수 없습니다. Dataclass는 각 JSON 키를 이름 있는 타입 지정 필드에 매핑하여 이 문제를 해결합니다. 중첩된 JSON 객체는 별도의 dataclass 정의가 되고, 배열은 List[T] 어노테이션이 되며, null 값은 기본값 None을 가진 Optional[T]가 됩니다.

이러한 정의를 수동으로 작성하는 것은 기계적인 작업입니다. JSON을 읽고, 값에서 각 필드의 타입을 파악하고, camelCase 또는 snake_case에서 Python 관례로 키를 변환하고, nullable 필드나 혼합 타입 배열 같은 엣지 케이스를 처리해야 합니다. 변환기는 이 모든 것을 밀리초 안에 처리합니다. JSON을 붙여넣으면 올바른 dataclass 코드를 얻고 바로 작업을 계속할 수 있습니다.

JSON to Python 변환기를 사용하는 이유

JSON 구조를 Python 클래스 정의로 수동 변환하면 샘플 데이터에서 타입을 추측하고, 선택적 필드보다 필수 필드가 먼저 오도록 필드를 재정렬하고, API가 변경될 때마다 모든 것을 업데이트해야 합니다. 변환기는 이러한 불편함을 제거합니다.

즉시 dataclass 생성
JSON을 붙여넣으면 1초 이내에 타입이 지정된 Python dataclass 정의를 얻습니다. 중첩 객체, 리스트, 선택적 필드가 자동으로 처리됩니다.
🔒
개인정보 보호 우선 처리
변환은 JavaScript를 사용하여 전적으로 브라우저에서 실행됩니다. JSON이 기기 밖으로 나가지 않습니다. API 키, 토큰, 사용자 레코드가 비공개로 유지됩니다.
📝
정확한 타입 어노테이션
생성된 모든 필드에는 JSON 값에서 추론된 Python 타입 어노테이션이 포함됩니다: str, int, float, bool, List[T], 또는 null에 대한 Optional[T].
📦
설치 또는 가입 불필요
페이지를 열고 JSON을 붙여넣으면 됩니다. Python 환경, pip 패키지 설치, 계정 생성이 필요 없습니다.

JSON to Python 활용 사례

REST API 클라이언트 개발
API 응답 샘플에서 dataclass를 생성합니다. 서드파티 REST 엔드포인트가 반환하는 JSON을 붙여넣으면 requests 또는 httpx에 바로 사용할 수 있는 타입 안전한 Python 클래스를 얻습니다.
FastAPI 요청/응답 모델
JSON 페이로드 형태에서 시작하여 dataclass 정의를 생성합니다. FastAPI 라우트 핸들러에서 자동 검증을 받으려면 Pydantic 모델로 변환하세요.
데이터 파이프라인 스키마
ETL 파이프라인의 타입이 지정된 레코드 구조를 정의합니다. Kafka, RabbitMQ, SQS의 샘플 JSON 메시지를 붙여넣어 예상 형태를 문서화하는 dataclass를 생성합니다.
설정 파일 파싱
JSON 설정 파일을 타입이 지정된 Python 클래스로 변환합니다. json.load()로 설정을 로드한 후 에디터 자동 완성과 타입 검사를 위해 dataclass 인스턴스를 생성합니다.
테스트 픽스처 생성
샘플 JSON 데이터에서 타입이 지정된 픽스처를 생성합니다. QA 엔지니어는 API 응답 스냅샷을 붙여넣어 pytest 테스트 스위트에서 사용할 dataclass 정의를 만들 수 있습니다.
Python 타입 어노테이션 학습
학생들은 어떤 JSON 구조든 붙여넣어 Python이 타입 힌트로 이를 어떻게 표현하는지 확인할 수 있습니다. 생성된 코드는 List, Optional, 중첩 클래스, 기본값을 실제 예시로 보여줍니다.

JSON to Python 타입 매핑

모든 JSON 값은 특정 Python 타입 어노테이션에 매핑됩니다. 아래 표는 변환기가 각 JSON 타입을 어떻게 변환하는지 typing 모듈 문법(Python 3.7+)과 Python 3.10부터 사용 가능한 내장 문법 모두로 보여줍니다.

JSON 타입예시Python (typing)Python 3.10+
string"hello"strstr
number (integer)42intint
number (float)3.14floatfloat
booleantrueboolbool
nullnullOptional[str]str | None
object{"k": "v"}@dataclass classnested model
array of strings["a", "b"]List[str]list[str]
array of objects[{"id": 1}]List[Item]list[Item]
mixed array[1, "a"]List[Any]list[Any]

Dataclass 데코레이터 참조

@dataclass 데코레이터는 생성된 클래스의 동작을 변경하는 여러 파라미터를 받습니다. 이 참조는 JSON에서 파생된 데이터를 다룰 때 가장 관련성 높은 옵션을 다룹니다.

데코레이터 / 필드동작사용 시점
@dataclassGenerates __init__, __repr__, __eq__ from field annotationsStandard dataclasses
@dataclass(frozen=True)Makes instances immutable (hashable, no attribute reassignment)Config objects, dict keys
@dataclass(slots=True)Uses __slots__ for lower memory and faster attribute accessPython 3.10+, large datasets
@dataclass(kw_only=True)All fields require keyword arguments in __init__Python 3.10+, many fields
field(default_factory=list)Sets a mutable default without sharing state between instancesList/dict/set defaults

dataclass vs Pydantic vs TypedDict

Python에는 JSON에서 타입이 지정된 구조를 정의하는 세 가지 일반적인 방법이 있습니다. 각각 다른 사용 사례에 적합합니다. Dataclass는 외부 의존성이 없는 표준 라이브러리 옵션입니다. Pydantic은 런타임 검증을 추가합니다. TypedDict는 새 클래스를 생성하지 않고 일반 dict에 어노테이션을 추가합니다.

@dataclass
표준 라이브러리(Python 3.7+). __init__, __repr__, __eq__를 자동 생성합니다. 런타임 검증 없음. mypy 및 직렬화를 위한 dataclasses-json과 함께 동작합니다. 입력을 제어하는 내부 데이터 구조에 최적입니다.
BaseModel (Pydantic)
서드파티 라이브러리. 런타임에 타입과 제약 조건을 검증합니다. model_validate_json()으로 JSON을 직접 파싱합니다. FastAPI, 설정 관리, 신뢰할 수 없는 입력을 받는 코드의 표준 선택입니다.
TypedDict
표준 라이브러리(Python 3.8+). 일반 dict에 타입 힌트를 추가합니다. __init__이나 메서드가 생성되지 않습니다. 값은 일반 dict 접근 방식을 유지합니다. 타입 검사는 필요하지만 레거시 코드베이스처럼 dict 인터페이스를 유지하고 싶을 때 사용합니다.

코드 예제

이 예제들은 Python에서 생성된 dataclass를 사용하는 방법, JavaScript로 프로그래밍 방식으로 생성하는 방법, Pydantic 및 CLI 도구 같은 대안적 접근 방식을 보여줍니다.

Python (dataclasses)
from dataclasses import dataclass
from typing import List, Optional
import json

@dataclass
class Address:
    street: str
    city: str
    zip: str

@dataclass
class User:
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

raw = '{"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"],"metadata":null}'
data = json.loads(raw)

# Reconstruct nested objects manually
addr = Address(**data["address"])
user = User(**{**data, "address": addr})
print(user.name)     # -> Alice
print(user.address)  # -> Address(street='123 Main St', city='Springfield', zip='12345')
JavaScript (generate Python from JSON)
// Minimal JSON-to-Python-dataclass generator in JS
function jsonToPython(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Optional[str]";
    if (typeof val === "string") return "str";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "float";
    if (typeof val === "boolean") return "bool";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      return first ? `List[${infer(first, fieldName + "Item")}]` : "List[Any]";
    }
    if (typeof val === "object") {
      const clsName = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, clsName);
      return clsName;
    }
    return "Any";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => `    ${k}: ${infer(v, k)}`);
    classes.push(`@dataclass\nclass ${cls}:\n${fields.join("\n")}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

const data = { id: 1, name: "Alice", scores: [98, 85] };
console.log(jsonToPython(data, "User"));
// @dataclass
// class User:
//     id: int
//     name: str
//     scores: List[int]
Python (Pydantic BaseModel alternative)
from pydantic import BaseModel
from typing import List, Optional

class Address(BaseModel):
    street: str
    city: str
    zip: str

class User(BaseModel):
    id: int
    name: str
    email: str
    active: bool
    score: float
    address: Address
    tags: List[str]
    metadata: Optional[str] = None

# Pydantic parses and validates JSON in one step
raw = '{"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"],"metadata":null}'
user = User.model_validate_json(raw)
print(user.name)              # -> Alice
print(user.model_dump_json()) # -> re-serializes to JSON
CLI (datamodel-code-generator)
# Install the generator
pip install datamodel-code-generator

# Generate dataclasses from a JSON file
datamodel-codegen --input data.json --output models.py --output-model-type dataclasses.dataclass

# Generate Pydantic models instead
datamodel-codegen --input data.json --output models.py

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  datamodel-codegen --output-model-type dataclasses.dataclass
# Output:
# @dataclass
# class Model:
#     id: int
#     name: str
#     tags: List[str]

자주 묻는 질문

Python dataclass와 일반 클래스의 차이는 무엇인가요?
@dataclass 데코레이터는 필드 어노테이션에서 __init__, __repr__, __eq__ 메서드를 자동 생성합니다. 일반 클래스는 이러한 메서드를 직접 작성해야 합니다. Dataclass는 클래스가 주로 데이터를 담을 때 보일러플레이트를 줄여줍니다. JSON에서 파생된 구조가 바로 이런 경우입니다.
JSON 직렬화에 dataclass를 직접 사용할 수 있나요?
표준 라이브러리의 json 모듈은 기본적으로 dataclass 인스턴스를 직렬화할 수 없습니다. dataclasses.asdict()를 사용하여 dataclass를 dict로 변환한 후 json.dumps()에 전달하세요. 더 많은 제어를 원한다면 dataclasses-json 라이브러리가 .to_json()과 .from_json() 메서드를 추가하고, Pydantic 모델은 직렬화를 기본으로 지원합니다.
변환기는 중첩된 JSON 객체를 어떻게 처리하나요?
중첩된 각 객체는 별도의 @dataclass 정의가 됩니다. "address"라는 JSON 필드에 "street"와 "city"가 포함된 객체가 있으면 변환기는 Address dataclass를 생성하고 부모 필드를 address: Address로 어노테이션합니다. 깊게 중첩된 구조는 의존성 순서에 따라 여러 dataclass 정의를 생성합니다.
JSON 필드가 null이면 어떻게 되나요?
Null 필드는 기본값 None을 가진 Optional[str](또는 컨텍스트에서 추론 가능한 경우 적절한 타입)로 어노테이션됩니다. 기본값이 있는 필드는 dataclass에서 필수 필드 뒤에 와야 하므로 변환기는 선택적 필드를 클래스 정의 끝에 배치합니다.
JSON에서 dataclass와 Pydantic 모델의 차이는 무엇인가요?
Dataclass는 표준 라이브러리의 일부로 런타임에 데이터를 검증하지 않습니다. Pydantic 모델은 타입을 검증하고, 제약 조건을 강제하며, 원시 JSON 문자열을 직접 파싱할 수 있습니다. 외부 소스에서 JSON을 받고 잘못된 데이터를 거부해야 한다면 Pydantic이 더 적합합니다. 입력을 신뢰하는 내부 데이터 전달에는 dataclass가 더 가볍고 외부 의존성이 없습니다.
Python dataclass에서 camelCase JSON 키를 어떻게 처리하나요?
Python 관례는 변수 이름에 snake_case를 사용합니다. 변환기는 "firstName" 같은 camelCase 키를 first_name 같은 snake_case 필드로 변환합니다. JSON에서 역직렬화해야 한다면 두 명명 규칙 사이를 매핑하는 설정과 함께 dataclasses-json 라이브러리를 사용하거나 커스텀 __post_init__ 메서드를 작성하세요.
이 변환기는 List[str] 대신 list[str] 같은 Python 3.10+ 문법을 지원하나요?
변환기는 Python 3.7부터 3.12까지 최대 호환성을 위해 typing 모듈 임포트(List, Optional)를 생성합니다. 프로젝트가 Python 3.10 이상을 대상으로 한다면 List[str]을 list[str]로, Optional[str]을 str | None으로 안전하게 교체할 수 있습니다. 위의 타입 매핑 표에서 두 형식을 모두 보여줍니다.