이 도구는 샘플 JSON 값에서 JSON Schema를 추론합니다. draft 2020-12 또는 draft-07의 $schema 줄, 선택적인 title, 발견한 모든 수준의 type, properties, required, items, additionalProperties를 씁니다.
API 페이로드나 설정 파일을 검증할 때의 출발점으로 쓰기 좋습니다. 대표 문서를 붙여넣어 스키마를 만든 뒤 format, minimum, enum처럼 샘플로는 알 수 없는 제약을 추가하세요. 결과는 이 사이트의 JSON Schema 검증기에 붙여넣을 수 있습니다.
입력은 브라우저 안에서만 처리되며 업로드되지 않습니다. 한도는 20 MiB이고 배열이나 단일 값을 포함해 어떤 JSON 값도 루트로 받습니다.
사용 방법
샘플 붙여넣기
JSON 문서를 붙여넣습니다. 목록이라면 선택 키와 혼합 타입이 드러나도록 레코드를 여러 개 넣으세요.
제목과 드래프트 정하기
스키마 제목(기본
GeneratedSchema, 비우면 키워드 생략)을 고치고 Draft 2020-12 또는 Draft-07을 고릅니다. 드래프트는$schemaURL만 바꿉니다.required와 추가 속성 정하기
키를 필수로 표시를 켜면 샘플의 모든 객체에 있는 키가 required에 들어갑니다. 추가 속성 허용을 끄면
additionalProperties: false, 켜면true가 나옵니다.변환하고 검토
잘못된 JSON이나 빈 입력은 오류를 보여 줍니다.
["integer", "null"]같은 타입 목록과anyOf블록이 데이터에 대해 알고 있는 내용과 맞는지 확인합니다.복사 또는 다운로드
스키마를 복사하거나
schema.json으로 저장한 뒤 제약은 직접 추가합니다.
작동 원리
타입 추론 방식
JSON 값은 스키마 타입 string, number, integer, boolean, null, object, array로 대응됩니다. 정수는 integer, 소수부가 있는 수는 number이며 파싱된 값으로 판정하므로 2.0은 integer입니다. 한 위치에 두 종류가 모두 나오면 number가 됩니다.
한 위치에 원시 타입이 여럿이면 ["string", "integer"] 같은 타입 목록이 됩니다. 원시 타입과 객체·배열이 섞이거나 객체와 배열이 섞이면 모양마다 항목 하나인 anyOf가 됩니다.
배열 항목 병합과 required 키
배열은 모든 원소가 하나의 items 스키마로 병합되고 객체 원소들의 키는 합쳐집니다. 샘플의 모든 객체에 있는 키만 required에 들어가며, 키를 필수로 표시를 끄면 required 목록은 아예 쓰이지 않습니다.
null은 타입에 추가됩니다. 어떤 레코드에서는 null이고 다른 곳에서는 정수인 값은 ["integer", "null"]이 되고, 항상 null인 값은 {"type": "null"}이 됩니다. 중첩 배열은 깊이를 유지해 [[1]]은 배열의 배열이 되며, 빈 배열은 items 없이 {"type": "array"}가 됩니다.
{
"type": "object",
"properties": { "k": { "type": ["integer", "null"] } },
"required": ["k"],
"additionalProperties": false
}additionalProperties 스위치
additionalProperties는 모든 객체 스키마에 항상 쓰이며 생략되지 않습니다. 스위치를 끄면 false가 되어 샘플에 없던 키를 검증기가 거부하고, 켜면 true가 됩니다. true는 JSON Schema 기본값과 같지만 명시적으로 드러납니다.
설정은 모든 중첩 객체에 한꺼번에 적용되므로 객체별로 다르게 하려면 출력을 직접 고쳐야 합니다.
실제 예시
{"id":1,"name":"Ada","price":1.5,"tags":["x"],"meta":null}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "GeneratedSchema",
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"price": {
"type": "number"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"meta": {
"type": "null"
}
},
"required": [
"id",
"name",
"price",
"tags",
"meta"
],
"additionalProperties": false
}정수는 integer, 소수는 number, null만 있는 값은 null 타입이 됩니다. 본 키는 모두 required이고 추가 속성은 기본으로 금지됩니다.
{"users":[{"id":1,"email":"a@example.com"},{"id":2}]}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "GeneratedSchema",
"type": "object",
"properties": {
"users": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"email": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
}
}
},
"required": [
"users"
],
"additionalProperties": false
}배열 원소가 병합됩니다. id는 두 레코드에 모두 있어 required이고, email은 한 레코드에만 있어 properties에만 나옵니다.
{"a":[1,"x"],"b":[],"c":[{"k":null},{"k":3}],"e":[1,{"x":1}]}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Order",
"type": "object",
"properties": {
"a": {
"type": "array",
"items": {
"type": [
"string",
"integer"
]
}
},
"b": {
"type": "array"
},
"c": {
"type": "array",
"items": {
"type": "object",
"properties": {
"k": {
"type": [
"integer",
"null"
]
}
},
"required": [
"k"
],
"additionalProperties": true
}
},
"e": {
"type": "array",
"items": {
"anyOf": [
{
"type": "integer"
},
{
"type": "object",
"properties": {
"x": {
"type": "integer"
}
},
"required": [
"x"
],
"additionalProperties": true
}
]
}
}
},
"required": [
"a",
"b",
"c",
"e"
],
"additionalProperties": true
}제목 Order, 추가 속성 허용을 켠 결과입니다. a는 타입 목록, c.k는 [integer, null]이고, e는 숫자와 객체가 섞여 anyOf가 됩니다.
[1,2,3]{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items": {
"type": "integer"
}
}Draft-07과 빈 제목으로 실행한 결과입니다. 루트는 어떤 JSON 값이든 되며, 정수 배열은 integer 항목의 배열 스키마가 됩니다.
{"id":1,"name":"Ada"}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "GeneratedSchema",
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
}
},
"additionalProperties": false
}키를 필수로 표시를 끈 결과입니다. properties는 나열되지만 required 배열은 쓰이지 않습니다.
자주 하는 실수
샘플로는 제약을 거의 알 수 없습니다
스키마는 본 것만 반영합니다. 이메일처럼 보이는 문자열도
type: string만 얻으므로format,pattern, 범위는 직접 추가하세요.레코드가 하나면 모든 키가 required입니다
샘플의 모든 객체에 있는 키가 required가 되는데, 객체가 하나면 비교 대상이 없습니다. 대표 레코드를 여러 개 넣거나 필수 옵션을 끄세요.
기본값이 엄격합니다
additionalProperties: false이면 API에 새 필드가 생길 때 검증이 실패합니다. 계속 바뀌는 페이로드에는 추가 속성 허용을 켜세요.섞인 모양은 anyOf가 됩니다
한 레코드에서는 문자열, 다른 레코드에서는 객체인 키는
anyOf가 됩니다. 정확하지만 번잡할 수 있으니 어떤 모양이 실제인지 알게 되면 단순화하세요.enum, format, 숫자 범위는 없습니다
enum,format,minimum,minLength,uniqueItems는 추론하지 않습니다.
자주 묻는 질문
어느 드래프트를 쓰나요?
draft 2020-12(기본)와 draft-07 중에서 고릅니다. 바뀌는 것은 $schema URL뿐이며 생성되는 키워드는 둘 다에서 유효합니다.
루트가 배열이어도 되나요?
됩니다. [1,2,3]은 { type: array, items: { type: integer } }가 됩니다.
null 허용 필드는 어떻게 표현되나요?
null과 다른 원시 타입이 함께 나오면 ["string", "null"] 같은 타입 목록이 됩니다. null이 가능한 객체나 배열은 type 목록에 null이 추가됩니다.
필드가 required에 없는 이유는 무엇인가요?
샘플의 객체 중 하나 이상에 그 키가 없었거나 키를 필수로 표시 옵션이 꺼져 있기 때문입니다.
타입이 서로 다르면 어떻게 되나요?
원시 타입끼리는 타입 목록으로 합쳐지고, 원시 타입과 객체·배열 또는 객체와 배열이 섞이면 anyOf가 됩니다. 조용히 버려지는 것은 없습니다.
$ref나 $defs를 지원하나요?
아니요. 중첩 객체는 인라인으로 쓰입니다.
데이터가 업로드되나요?
아니요. 추론은 브라우저 안에서 실행됩니다.
마지막 업데이트:
