Oh MyUtils

JSON to Python - 데이터클래스 & Pydantic 모델 생성 온라인

JSON을 Python dataclass, Pydantic BaseModel, TypedDict로 변환하세요. 타입 추론, snake_case 변환, 날짜 감지 — 100% 브라우저에서 처리.

루트 이름
포맷
Syntax
플래그
JSON 입력
Python 출력
 

자주 묻는 질문

JSON to Python 변환기란 무엇인가요?

JSON to Python 변환기는 JSON 데이터에서 Python 클래스 정의를 자동으로 생성하는 도구입니다. 필드 이름과 타입 어노테이션으로 수동으로 dataclass나 Pydantic 모델을 작성하는 대신, 샘플 JSON 객체를 붙여넣으면 도구가 모든 필드에 대해 올바른 Python 타입을 추론합니다. Python dataclass(표준 라이브러리), Pydantic BaseModel(내장 검증), TypedDict(경량 타입 힌트) 세 가지 출력 형식을 지원합니다.

JSON에서 Python 클래스를 어떻게 생성하나요?

왼쪽 입력 필드에 JSON 데이터를 붙여넣으세요. 도구가 즉시 오른쪽 출력 패널에 Python 코드를 생성합니다. 포맷 선택기를 사용하여 원하는 출력 형식(dataclass, Pydantic BaseModel, TypedDict)을 선택하세요. 루트 클래스 이름 설정, snake_case 변환, null 값 Optional 표시, 날짜/시간 감지 토글 등으로 출력을 커스터마이즈할 수 있습니다.

dataclass와 Pydantic BaseModel 중 어떤 것을 사용해야 하나요?

타입 어노테이션이 있는 간단하고 의존성 없는 데이터 컨테이너가 필요하면 Python dataclass를 사용하세요. dataclass는 표준 라이브러리(Python 3.7+)의 일부이며 런타임 검증 오버헤드가 없습니다. 런타임 데이터 검증, 자동 타입 변환, JSON 직렬화/역직렬화, alias 지원이 필요하면 Pydantic BaseModel을 사용하세요. TypedDict는 런타임 오버헤드 없이 딕셔너리형 데이터의 타입 힌트만 필요할 때 사용합니다.

이 도구는 Pydantic v2를 지원하나요?

네, 이 도구는 Pydantic v2 코드만 생성합니다. 레거시 class Config 패턴 대신 최신 Pydantic v2 구문인 model_config = ConfigDict(...)를 사용합니다. snake_case 변환이 활성화되면 Field(alias='originalKey')와 model_config = ConfigDict(populate_by_name=True)를 생성하여 snake_case Python 속성과 원래 camelCase JSON 키 모두에서 작동합니다.

이 도구를 사용할 때 JSON 데이터가 안전한가요?

네, 완전히 안전합니다. 이 도구는 클라이언트 사이드 JavaScript를 사용하여 브라우저에서 모든 것을 처리합니다. JSON 데이터는 컴퓨터를 떠나지 않습니다 — 서버 업로드, API 호출, 데이터 저장이 없습니다. 민감한 API 응답, 독점 데이터 스키마, 내부 마이크로서비스 계약, 기밀 설정 파일에 안전하게 사용할 수 있습니다.

null과 optional 필드는 어떻게 처리되나요?

JSON 필드에 null 값이 있으면 도구가 Optional로 표시하고 기본값을 None으로 설정합니다. 최신 Python 구문(3.10+)에서는 'field_name: str | None = None'이 됩니다. 레거시 구문에서는 'field_name: Optional[str] = None'을 사용합니다. '모두 Optional' 토글을 활성화하면 모든 필드를 optional로 표시할 수 있으며, 부분 업데이트 모델(PATCH 요청 본문 등) 생성에 유용합니다.

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

각 중첩 JSON 객체는 별도의 명명된 클래스로 변환됩니다. 예를 들어 JSON에 'address' 하위 객체가 있는 'user' 객체가 있으면 도구가 'User' 클래스와 'Address' 클래스를 모두 생성하고, 'User'가 필드 타입으로 'Address'를 참조합니다. 의존성이 참조하는 클래스보다 먼저 나타나도록 출력에서 클래스가 올바르게 정렬됩니다.

코드 예제

// JSON to Python dataclass/Pydantic generator
function jsonToPython(json, rootName = 'Root', format = 'dataclass') {
  const classes = [];

  function toPascalCase(str) {
    return str.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '')
              .replace(/^./, s => s.toUpperCase());
  }

  function toSnakeCase(str) {
    return str.replace(/([A-Z])/g, '_$1').replace(/^_/, '').toLowerCase();
  }

  function inferType(value, name) {
    if (value === null) return 'None';
    if (typeof value === 'boolean') return 'bool';
    if (typeof value === 'number') {
      return Number.isInteger(value) ? 'int' : 'float';
    }
    if (typeof value === 'string') return 'str';
    if (Array.isArray(value)) {
      if (value.length === 0) return 'list[Any]';
      return `list[${inferType(value[0], name)}]`;
    }
    if (typeof value === 'object') {
      const className = toPascalCase(name);
      const fields = Object.entries(value).map(([key, val]) => {
        const pyType = inferType(val, key);
        const fieldName = toSnakeCase(key);
        if (format === 'pydantic' && fieldName !== key) {
          return `    ${fieldName}: ${pyType} = Field(alias="${key}")`;
        }
        return `    ${fieldName}: ${pyType}`;
      });

      if (format === 'dataclass') {
        classes.push(`@dataclass\nclass ${className}:\n${fields.join('\n')}`);
      } else if (format === 'pydantic') {
        classes.push(`class ${className}(BaseModel):\n${fields.join('\n')}`);
      } else {
        classes.push(`class ${className}(TypedDict):\n${fields.join('\n')}`);
      }
      return className;
    }
    return 'Any';
  }

  const parsed = JSON.parse(json);
  inferType(parsed, rootName);
  return classes.reverse().join('\n\n');
}

// Example
const json = '{"userName": "alice", "age": 30, "address": {"city": "NYC"}}';
console.log(jsonToPython(json, 'User', 'pydantic'));
// Output:
// class Address(BaseModel):
//     city: str
//
// class User(BaseModel):
//     user_name: str = Field(alias="userName")
//     age: int
//     address: Address

관련 도구