JSON → Python Dataclass

JSON에서 Python dataclass를 즉시 생성. @dataclass, Pydantic v2 BaseModel, TypedDict 지원. 중첩 객체, 배열, 선택적 필드 처리. 무료, 브라우저에서 실행.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
비워 두면 Root를 사용합니다. 이름을 바꾸면 300밀리초 후 다시 생성합니다.
모드 @dataclass, Pydantic v2, TypedDict 중에서 선택하세요. 모드를 바꾸면 즉시 다시 생성합니다.
JSON을 중첩 객체, 배열, null이 포함된 예시로 바꾸고 현재 설정으로 즉시 생성합니다.
JSON, 출력, 상태를 지우고 루트 이름과 선택한 모드는 유지합니다. 도구 안에서 Ctrl/⌘+L을 누르면 루트 이름도 지웁니다.
주석이나 끝 쉼표가 없는 유효한 JSON을 입력하세요. 입력을 멈춘 뒤 300밀리초 후 생성합니다. JSON이 잘못되면 출력을 지우고 오류를 표시합니다.
Python 출력
현재 표시된 Python 출력 전체를 복사합니다. 출력이 비어 있으면 복사하지 않습니다.
현재 출력 전체를 .py 파일로 저장합니다. 파일명은 루트 이름을 소문자로 바꾸고 ASCII 영숫자와 밑줄 외의 문자를 밑줄로 바꿉니다. 빈 출력은 저장하지 않습니다.

JSON을 입력하거나 예시를 불러와 Python 코드를 생성하세요.

예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

타입 매핑

  • null → Optional[Any] = None
  • 문자열 → str
  • 정수 → int
  • 부동소수점 → float
  • 불리언 → bool
  • 배열 → List[T]
  • 혼합 배열 → List[Union[T1, T2]]
  • 중첩 객체 → 별도 클래스

예시

다음 JSON이 주어졌을 때:

{"user": {"first_name": "Alice", "age": 30}, "tags": ["admin"], "note": null}

@dataclass 모드에서 생성되는 코드:

from dataclasses import dataclass
from typing import Any, List, Optional

@dataclass
class User:
    first_name: str
    age: int

@dataclass
class Root:
    user: User
    tags: List[str]
    note: Optional[Any] = None

예시: 중첩 객체와 빠진 키

입력:

{"id": 7, "title": "Release notes", "author": {"name": "Alice", "email": null}, "tags": ["python", "json"], "score": 4.5, "comments": [{"user": "bob", "text": "nice"}, {"user": "carol"}]}

@dataclass 모드 출력:

from dataclasses import dataclass
from typing import Any, List, Optional

@dataclass
class Author:
  name: str
  email: Optional[Any] = None

@dataclass
class CommentsItem:
  user: str
  text: Optional[str] = None

@dataclass
class Root:
  id: int
  title: str
  author: Author
  tags: List[str]
  score: float
  comments: List[CommentsItem]

클래스는 사용되기 전에 정의되도록 정렬됩니다. 두 번째 댓글에는 text가 없어서 Optional[str] = None이 됩니다.

dataclass, Pydantic, TypedDict 차이

세 모드는 같은 구조를 나타내지만 실행 시 동작이 다릅니다(Python 3.12, Pydantic 2.13으로 확인):

root = Root(**json.loads(raw))
type(root.author)          # <class 'dict'>, not Author
root = Root.model_validate(json.loads(raw))   # Pydantic mode
root.comments[1]           # CommentsItem(user='carol', text=None)
  • @dataclass는 검증도 변환도 하지 않습니다. Root(**data)에서 중첩 객체는 그냥 dict로 남고, 타입이 달라도 받아들입니다. 믿을 수 있는 데이터에 쓰거나 중첩 필드를 직접 변환하세요.
  • Pydantic은 타입을 검증하고 중첩 모델을 만듭니다. 직접 관리하지 않는 API 응답에 적합합니다. model_validate_json(raw)로 파싱과 검증을 한 번에 합니다.
  • TypedDict는 타입 검사기에 dict 구조를 알려 줄 뿐 실행 시에는 아무것도 확인하지 않습니다. 모든 키가 기본적으로 필수이므로 도구는 일부 항목에만 있는 키를 NotRequired[...]로 씁니다(PEP 655, Python 3.11+는 typing, 그 이전은 typing_extensions). Optional[...]은 값이 None일 수 있다는 뜻일 뿐이고 키는 여전히 필수입니다.

예시: 키가 빠지는 TypedDict

note가 첫 항목에서는 null, 둘째 항목에서는 없고, discount는 둘째 항목에만 있는 상품 데이터(루트 클래스 이름 Product, TypedDict 모드):

[{"id": 1, "sku": "PEN-01", "price": 2, "note": null}, {"id": 2, "sku": "INK-07", "price": 1.5, "discount": 0.1}]
from typing import Any, NotRequired, Optional, TypedDict

class Product(TypedDict):
  id: int
  sku: str
  price: float
  note: NotRequired[Optional[Any]]
  discount: NotRequired[float]

price는 2와 1.5입니다. PEP 484는 int를 float 자리에 쓸 수 있게 하므로 타입은 float입니다. 실행 시 Product.required_keys는 {'id', 'sku', 'price'}, optional_keys는 {'note', 'discount'}입니다(Python 3.12에서 확인).

제한

  • null은 Optional[Any]가 됩니다. Any를 실제 타입으로 바꾸세요.
  • Python 식별자로 쓸 수 없는 키(user-id나 class 같은 예약어)는 이름을 바꾸고, Pydantic에서는 Field(alias="user-id")를 붙입니다.
  • 날짜는 str로 남습니다. 타입을 datetime으로 바꾸면 Pydantic이 ISO 8601 문자열을 변환합니다.
  • 루트가 기본 타입 배열이면 클래스를 만들지 않습니다.

빈 배열과 샘플 범위

빈 배열에는 요소 타입을 판단할 정보가 없으므로 {"tags": []}는 tags: List[Any]를 생성합니다. 같은 입력 배열에 {"tags": ["admin"]}가 있는 다른 객체를 넣으면 병합된 필드는 List[str]가 됩니다. 생성기는 입력한 샘플을 기준으로 타입을 추론하며, 어떤 샘플에도 없는 필드는 추론할 수 없습니다. 클래스를 복사하기 전에 키가 빠지거나 null 값이 있는 대표 객체를 포함하세요.

FAQ

이 도구는 무엇을 생성하나요?

JSON에서 Python 클래스 정의를 생성합니다. 표준 @dataclass(stdlib), Pydantic v2 BaseModel, 또는 TypedDict 중에서 선택할 수 있습니다. 각 중첩 객체는 자체 명명된 클래스가 됩니다.

어떤 출력 모드를 지원하나요?

세 가지 모드: @dataclass(Python stdlib, 기본값), Pydantic v2 BaseModel, TypedDict(Python 3.8+, NotRequired를 쓰면 3.11+ 또는 typing_extensions).

JSON 타입은 Python 타입에 어떻게 매핑되나요?

string→str, integer→int, float→float, boolean→bool, null→Optional[Any], array→List[T], 중첩 객체→별도 클래스.

필드가 Optional이 되는 경우는?

JSON 샘플에서 필드 값이 null이거나, 배열 객체를 병합할 때 일부 객체에서 필드가 누락된 경우 해당 필드는 Optional[T] = None으로 표시됩니다.

중첩 객체는 어떻게 처리되나요?

각 중첩 객체는 필드 키를 PascalCase로 변환한 이름의 독립 클래스로 추출됩니다. 자식 클래스는 항상 부모 클래스보다 먼저 정의되어 출력을 바로 사용할 수 있습니다.

데이터가 서버로 전송되나요?

아니요. 모든 변환은 브라우저에서 실행됩니다. 데이터는 사용자의 기기를 벗어나지 않습니다.