有一个 JSON 样本,但不知道怎么写对应的 Schema?把它粘进去,Schema 自动生成。这篇文章讲清楚工具是怎么推断的、哪些地方需要你手动调整,以及如何把生成结果用在实际项目里。

在线 JSON to JSON Schema 生成工具 →

JSON Schema 是什么?

JSON Schema 是描述 JSON 数据结构的一套规范。它回答这些问题:这个对象有哪些字段?哪些是必填的?允许什么类型?值范围是什么?

一个最简单的例子:

// 输入 JSON
{
  "userId": 42,
  "email": "alice@example.com",
  "active": true
}

// 生成的 JSON Schema(draft-07)
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "userId": { "type": "integer" },
    "email": { "type": "string" },
    "active": { "type": "boolean" }
  },
  "required": ["userId", "email", "active"]
}

Schema 描述了数据的”形状”,不包含具体值。有了 Schema,就可以用它验证其他 JSON 对象是否符合同样的结构。

类型推断规则

工具检查每个值,按以下规则映射到 JSON Schema 类型:

JSON 值示例推断类型
42"integer"
3.14"number"
"hello""string"
true / false"boolean"
null"null"
[...]"array"
{...}"object"

integer vs number:JSON 本身不区分整数和浮点数,但 JSON Schema 区分。工具检查值是否有小数部分:整数用 "integer",小数用 "number"。如果你的字段可能出现 1.5 这样的值,把 "integer" 改成 "number"

null 的处理:样本中的 null 会被推断为 "type": "null"。如果该字段有时是字符串、有时是 null,需要手动改成 "type": ["string", "null"]——单一样本无法推断出这种联合类型。

必填字段(required)

工具默认把样本中出现的所有字段都加入 required 数组。这是保守策略——工具不知道你的业务里哪些字段可以缺失。

需要手动检查:把你系统中确实可以省略的字段从 required 里删掉。比如 middleName 不是每个用户都有,就从 required 中移除即可。不要用 "nullable": true——那是 OpenAPI 的扩展写法,不是标准 JSON Schema。

嵌套对象和数组

工具支持任意深度的嵌套:

// 输入
{
  "user": {
    "name": "张三",
    "address": {
      "city": "深圳",
      "zip": "518000"
    }
  },
  "roles": ["admin", "editor"]
}

// 生成的 Schema(节选)
{
  "type": "object",
  "properties": {
    "user": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "address": {
          "type": "object",
          "properties": {
            "city": { "type": "string" },
            "zip": { "type": "string" }
          },
          "required": ["city", "zip"]
        }
      },
      "required": ["name", "address"]
    },
    "roles": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["user", "roles"]
}

数组元素类型:工具取数组第一个元素的类型作为 items 类型。如果数组为空([]),items 会被省略,需要手动补充。如果数组包含混合类型,只有第一个元素的类型会被采用。

在项目中使用生成的 Schema

JavaScript —— 用 Ajv 验证

import Ajv from 'ajv';

const ajv = new Ajv();
const schema = {
  type: 'object',
  properties: {
    userId: { type: 'integer' },
    email: { type: 'string', format: 'email' },
    active: { type: 'boolean' }
  },
  required: ['userId', 'email', 'active'],
  additionalProperties: false  // 拒绝多余字段
};

const validate = ajv.compile(schema);

const data = { userId: 1, email: 'alice@example.com', active: true };
if (!validate(data)) {
  console.error(validate.errors);
}

additionalProperties: false 工具不会自动加,但在接口验证场景中很有用——可以拒绝带有意外字段的请求。

Python —— 用 jsonschema 验证

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "userId": {"type": "integer"},
        "email": {"type": "string"},
        "active": {"type": "boolean"}
    },
    "required": ["userId", "email", "active"]
}

data = {"userId": 1, "email": "alice@example.com", "active": True}

try:
    validate(instance=data, schema=schema)
    print("校验通过")
except ValidationError as e:
    print(f"校验失败: {e.message}")

配合 FastAPI 使用

FastAPI 使用 Pydantic 定义请求体,底层导出的也是 JSON Schema。你可以把 API 返回的响应样本粘贴进工具,快速推断出对应的 Pydantic 模型结构:

from pydantic import BaseModel
from typing import Optional

class UserResponse(BaseModel):
    userId: int
    email: str
    active: bool
    middleName: Optional[str] = None  # 可选字段,不在 required 里

用 JSON to JSON Schema 工具生成初稿,再对照 Pydantic 模型调整类型和约束,效率比手写高很多。

补充约束:让 Schema 真正可用

工具生成的是结构骨架,要让 Schema 发挥验证作用,需要手动添加约束:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "userId": {
      "type": "integer",
      "minimum": 1
    },
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 254
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150
    },
    "status": {
      "type": "string",
      "enum": ["active", "inactive", "pending"]
    }
  },
  "required": ["userId", "email"]
}

常用约束:

  • "format": "email" / "format": "uri" / "format": "date-time" — 字符串语义约束
  • "minimum" / "maximum" — 数值范围
  • "minLength" / "maxLength" — 字符串长度限制
  • "pattern" — 正则约束
  • "enum" — 枚举值限制

JSON Schema 各版本对比

工具输出 draft-07 格式,这是兼容性最广的版本。各版本主要区别:

版本主要变化
draft-04基础版本,所有验证库都支持
draft-06新增 constcontainspropertyNames
draft-07新增 if/then/else 条件验证
draft-2019-09词汇表系统,$recursiveRef
draft-2020-12prefixItemsunevaluatedProperties

Python 的 jsonschema 库 4.0 以下版本默认支持到 draft-04;Ajv 8.x 默认使用 draft-2020-12。根据你的验证库版本选择合适的 draft。

立即生成 JSON Schema

ZeroTool JSON to JSON Schema 工具 支持从任意 JSON 对象实时推断完整的 draft-07 Schema。粘贴 JSON,复制 Schema,直接用于验证。无需注册,全部在浏览器本地运行。

立即使用 JSON Schema 生成工具 →