JSON → Zod 스키마

JSON 데이터에서 Zod 유효성 검사 스키마를 즉시 생성. 중첩 객체, 배열, nullable 필드, 선택적 속성 지원. 브라우저에서 처리.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
스키마 상수와 추론한 타입의 이름을 설정하세요. 비워 두면 Root를 사용합니다. 변경 후 Zod 스키마 생성을 클릭해 적용하세요.
생성된 z.object 스키마에 .strict()를 붙여 Zod가 추가 키를 거부하게 합니다. Zod 스키마 생성을 클릭해 적용하세요.
현재 JSON, 루트 이름, 엄격 모드로 즉시 생성합니다. Ctrl/⌘+Enter로도 생성할 수 있습니다.
입력을 중첩 객체, 배열, null이 있는 예시로 바꾸고 현재 루트 이름과 엄격 모드로 생성합니다.
JSON, 출력, 상태를 지우고 루트 이름과 엄격 모드는 유지합니다. 도구 안에서 Ctrl/⌘+L을 누르면 루트 이름도 지웁니다.
유효한 JSON을 입력하세요. 입력을 멈춘 뒤 300밀리초 후 생성하며 잘못된 JSON은 출력을 지웁니다. 루트에 객체, 배열, 기본 타입을 사용할 수 있습니다.
Zod 스키마 출력
Zod 가져오기, 스키마, 추론한 타입을 포함한 현재 TypeScript 코드 전체를 복사합니다. 출력이 비어 있으면 복사하지 않습니다.

JSON을 입력하거나 예시를 불러와 Zod 스키마를 생성하세요.

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

출력 형식

완전한 TypeScript 스니펫을 출력합니다:

  • import { z } from “zod” — Zod 가져오기
  • const FooSchema = z.object({…}) — 스키마 정의
  • export type Foo = z.infer<typeof FooSchema> — 추론된 TypeScript 타입

주요 사용 사례

  • API 유효성 검사: API 응답 예시에서 스키마를 생성하여 실제 응답을 런타임에 검증.
  • 폼 유효성 검사: 폼 데이터 형태를 Zod 스키마로 변환하여 react-hook-form 등에서 활용.
  • 설정 파일: JSON 파일에서 로드하는 설정 객체를 정의하고 검증.
  • 타입 안전성: TypeScript와 결합하여 하나의 스키마에서 런타임 검증과 정적 타입 추론을 동시에.

변환 예시

루트 이름을 User로 두고 다음 JSON을 넣으면

{
  "id": 42,
  "email": "alice@example.com",
  "price": 19.9,
  "tags": ["admin", "beta"],
  "metadata": null,
  "orders": [
    { "sku": "A1", "qty": 2 },
    { "sku": "B7", "qty": 1, "note": "gift" }
  ]
}

다음 결과가 나옵니다.

import { z } from "zod";

const UserSchema = z.object({
  id: z.number().int(),
  email: z.string(),
  price: z.number(),
  tags: z.array(z.string()),
  metadata: z.null(),
  orders: z.array(z.object({
    sku: z.string(),
    qty: z.number().int(),
    note: z.string().optional(),
  })),
});

export type User = z.infer<typeof UserSchema>;

주문 두 건 중 한 건에만 note가 있으므로 note는 optional입니다. 출력에는 Zod 3과 Zod 4에서 모두 동작하는 호출만 씁니다.

생성된 스키마 다듬기

샘플에는 필드마다 값이 하나뿐이라 업무 규칙은 알 수 없습니다. 사용하기 전에 다음을 확인하세요.

생성 결과문제수정 (Zod 4)
email: z.string()아무 문자열이나 통과z.email() (Zod 3: z.string().email())
qty: z.number().int()값이 항상 정수일 때만 맞음. 샘플의 price: 10도 .int()가 되어, 나중에 10.5가 “expected int”로 실패가격은 z.number()로 바꾸고 .min(0)이나 .positive() 추가
metadata: z.null()null만 통과z.string().nullable()
status: z.string()아무 문자열이나 통과z.enum(["active", "inactive"])
샘플에 있던 필드API가 가끔 빼더라도 필수가 됨.optional() 추가

실패하면 멈춰야 하는 곳(시작 시 설정 읽기 등)에는 .parse()를 씁니다. ZodError를 던집니다. API 응답과 사용자 입력에는 .safeParse()를 씁니다. { success: false, error }를 반환하므로 오류를 직접 처리할 수 있습니다.

제한 사항

  • 타입은 샘플 하나로 정해집니다. 빈 배열은 z.array(z.unknown()), 빈 객체는 z.record(z.string(), z.unknown())가 됩니다.
  • null은 z.null()이 됩니다. .nullable()은 붙지 않습니다. 객체 배열에서 어떤 키가 첫 항목에서 null, 두 번째 항목에서 문자열이면 z.union([z.null(), z.string()])이 됩니다.
  • 타입이 섞인 배열은 union이 됩니다. [{"a": 1}, 2] 같은 배열은 루트에 있든 객체 안에 있든 z.array(z.union([z.number().int(), z.object({ a: z.number().int() })]))가 됩니다. 같은 배열의 객체는 하나의 z.object로 합치므로 union의 객체 멤버는 하나입니다.
  • 문자열 형식과 범위는 없습니다. 이메일, URL, 날짜, UUID는 모두 z.string()입니다.

FAQ

Zod이란 무엇인가요?

Zod는 TypeScript 우선 스키마 선언 및 유효성 검사 라이브러리입니다. 데이터의 형태를 스키마로 정의하고 런타임에 데이터를 검증할 수 있습니다. API 응답 검증, 폼 유효성 검사, 설정 파싱에 널리 사용됩니다.

타입은 어떻게 추론되나요?

각 JSON 값을 검사합니다: 문자열→z.string(), 불리언→z.boolean(), 정수→z.number().int(), 부동소수점→z.number(), null→z.null(), 배열→z.array(), 객체→z.object(). 객체 배열에서 일부 항목에만 있는 키는 선택적으로 표시됩니다.

엄격 모드란 무엇인가요?

엄격 모드를 활성화하면 모든 z.object()에 .strict()가 추가됩니다. 스키마에 정의되지 않은 추가 키가 포함된 입력 객체를 Zod가 거부합니다. 비활성화 시 추가 키는 자동으로 무시됩니다.

생성된 스키마를 바로 사용할 수 있나요?

생성된 스키마는 좋은 시작점입니다. 문자열·숫자에 .min()/.max() 제약 추가, nullable 필드를 .nullable().optional()로 변경, 중첩 스키마를 별도 상수로 분리하는 등 프로젝트에 맞게 조정하는 것을 권장합니다.

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

아니요. 모든 처리는 브라우저 내에서 완전히 이루어집니다. JSON 데이터는 기기 밖으로 나가지 않습니다.