Skip to content
json2026-07-256 分钟阅读

什么是 JSON Schema

JSON Schema 是一种基于 JSON 格式的声明式数据校验语言,用于描述 JSON 数据的结构、类型和约束。它就像 JSON 世界的"类型系统",让你可以精确地定义一段 JSON 数据应该长什么样。

定义与用途

简单来说,JSON Schema 本身也是一段 JSON,它描述了另一段 JSON 必须满足的规则。例如:

  • name 字段必须是字符串
  • age 字段必须是大于 0 的整数
  • email 字段是可选的,但如果存在必须符合邮箱格式
  • tags 必须是数组,且每个元素都是字符串

历史背景

JSON Schema 的第一个草案发布于 2010 年,经过多个版本迭代后,目前最新的稳定版本是 2020-12。它由 JSON Schema 社区维护,已成为业界事实上的标准,被广泛应用于 API 设计、配置校验、表单验证等场景。

JSON Schema 的核心概念

理解 JSON Schema 的关键在于掌握以下几个核心关键字。

type:数据类型

type 定义了数据的基本类型,可选值包括:

  • string:字符串
  • number:数字(整数和浮点数)
  • integer:整数
  • boolean:布尔值
  • array:数组
  • object:对象
  • null:空值
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "integer" },
    "active": { "type": "boolean" }
  }
}

properties:对象属性

properties 用于定义对象的各个字段及其对应的 Schema。配合 type: "object" 使用。

required:必填字段

required 是一个字符串数组,列出哪些字段是必须存在的。注意 required 是同级于 properties 的,而不是写在每个属性内部。

{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "email": { "type": "string" }
  },
  "required": ["name"]
}

上面的 Schema 表示:name 必须有,email 是可选的。

items:数组元素

items 用于定义数组中每个元素的结构。

{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": { "type": "integer" },
      "name": { "type": "string" }
    },
    "required": ["id", "name"]
  }
}

这个 Schema 描述了一个用户列表数组,每个用户必须有 idname

enum:枚举值

enum 限制字段只能取指定的值之一。

{
  "type": "string",
  "enum": ["admin", "editor", "viewer"]
}

其他常用关键字

| 关键字 | 作用 | 示例 | |--------|------|------| | minLength / maxLength | 字符串长度限制 | "minLength": 1 | | minimum / maximum | 数字范围 | "minimum": 0, "maximum": 150 | | pattern | 正则匹配 | "pattern": "^[a-z]+$" | | format | 格式验证 | "format": "email" | | minItems / maxItems | 数组长度 | "minItems": 1 | | uniqueItems | 数组元素唯一 | "uniqueItems": true |

为什么需要 JSON Schema

1. 数据校验

这是最直接的用途。在接收外部数据时(API 请求、用户输入、配置文件),用 JSON Schema 校验数据合法性,避免后续逻辑因为数据格式错误而出问题。

2. API 文档与契约

JSON Schema 可以作为 API 的"契约":

  • 后端:用 Schema 定义请求/响应结构,自动生成文档
  • 前端:根据 Schema 生成类型定义和 mock 数据
  • 测试:用 Schema 验证 API 返回是否符合预期

OpenAPI(原 Swagger)规范就是基于 JSON Schema 来描述 API 的。

3. 前后端协作

有了 JSON Schema,前后端可以并行开发:

  1. 双方先约定好 Schema
  2. 前端根据 Schema 生成 mock 数据进行开发
  3. 后端根据 Schema 实现接口
  4. 联调时用 Schema 验证数据一致性

这大大减少了联调阶段的"字段名拼错""类型不匹配"等低级问题。

4. 配置文件校验

应用的配置文件(如 config.json)可以用 JSON Schema 来校验,防止因为配置错误导致应用启动失败。许多编辑器(VS Code、JetBrains 系列)都支持根据 JSON Schema 实时校验和补全配置文件。

JSON Schema 生成方法

手写 Schema

对于简单的结构,手写 Schema 是最直接的方式。优点是精确可控,缺点是繁琐、容易出错,特别是对于深层嵌套的复杂结构。

从数据自动生成

更高效的方式是:先有一份 JSON 数据样本,然后用工具自动生成 JSON Schema

这种方式的优势:

  • 快速:几秒钟生成,比手写快几十倍
  • 准确:不会漏字段、不会拼错属性名
  • 可迭代:数据变化后重新生成即可

自动生成的 Schema 可能需要少量手动调整(比如加上 requiredenumpattern 等约束),但基础结构已经搭好了,能节省大量时间。

常见应用场景

场景一:API 请求校验

在后端接口中,用 JSON Schema 校验请求体:

const schema = {
  type: "object",
  properties: {
    username: { type: "string", minLength: 3 },
    email: { type: "string", format: "email" },
    password: { type: "string", minLength: 8 }
  },
  required: ["username", "email", "password"]
};

app.post("/register", (req, res) => {
  const valid = validate(req.body, schema);
  if (!valid) {
    return res.status(400).json({ error: "Invalid request data" });
  }
  // 处理注册逻辑
});

场景二:配置文件校验

应用启动时校验配置文件,提前发现问题:

import jsonschema
import json

with open("config.schema.json") as f:
    schema = json.load(f)

with open("config.json") as f:
    config = json.load(f)

jsonschema.validate(config, schema)

场景三:测试数据生成

根据 JSON Schema 可以反向生成测试数据(mock data)。工具会根据类型、范围、枚举等约束自动生成合理的测试用例,大大提高测试效率。

使用 DevToolkit Pro 快速生成 JSON Schema

手动编写复杂的 JSON Schema 既耗时又容易出错。使用 DevToolkit Pro 的 JSON Schema Generator 工具,只需粘贴你的 JSON 数据,一秒钟就能生成完整的 Schema。

三步生成 Schema

  1. 粘贴 JSON 数据:在左侧输入框粘贴你的 JSON 样本
  2. 自动生成:工具实时分析数据结构,在右侧生成 JSON Schema
  3. 复制使用:点击 Copy 按钮,将 Schema 粘贴到你的项目中

工具优势

  • 纯前端运行:你的 JSON 数据不会上传到服务器,保护隐私安全
  • 实时生成:输入数据变化时 Schema 即时更新,无需等待
  • 类型推断准确:自动识别 string、number、integer、boolean、array、object 等类型
  • 嵌套结构支持:无论多深的嵌套对象和数组都能正确生成
  • 免费无限制:所有功能完全免费,没有使用次数限制

生成 Schema 后,你可以根据需要手动调整,比如添加 required 字段、设置 enum 枚举值、补充 pattern 正则约束等。

最佳实践

1. 从简单开始,逐步完善

不要一开始就追求完美的 Schema。先从数据自动生成基础结构,再逐步添加约束和验证规则。

2. 合理使用 additionalProperties

默认情况下,JSON Schema 允许对象有未在 properties 中声明的额外属性。如果你想严格禁止额外属性,加上 "additionalProperties": false。但要注意,这可能导致后续扩展困难,需要权衡。

3. 用 $ref 复用 Schema

对于重复出现的结构(比如用户信息、分页参数),用 $ref 引用公共定义,避免重复代码:

{
  "$defs": {
    "user": {
      "type": "object",
      "properties": {
        "id": { "type": "integer" },
        "name": { "type": "string" }
      }
    }
  },
  "type": "object",
  "properties": {
    "author": { "$ref": "#/$defs/user" },
    "reviewers": {
      "type": "array",
      "items": { "$ref": "#/$defs/user" }
    }
  }
}

4. 版本控制 Schema

把 Schema 文件纳入版本控制,和代码一起管理。Schema 变更时,相关代码也要同步更新。

5. 选择合适的校验库

不同语言有各自成熟的 JSON Schema 实现:

  • JavaScript/TypeScript:Ajv、Zod、Valibot
  • Python:jsonschema、pydantic
  • Go:go-playground/validator
  • Java:Jackson、Everit JSON Schema

FAQ

JSON Schema 和 TypeScript 类型有什么区别?

JSON Schema 是运行时的数据校验规范,与编程语言无关;TypeScript 类型是编译时的静态类型检查,只在开发阶段生效。两者可以互补:用 JSON Schema 做运行时校验,用 TypeScript 类型做开发时的类型提示。实际上,你可以用工具在两者之间互相转换。

JSON Schema validator 有哪些推荐?

JavaScript 生态中最流行的是 Ajv,它性能优秀、支持完整的 JSON Schema 规范。如果你用 TypeScript,还可以考虑 Zod,它提供了更符合 TypeScript 习惯的 API,并且可以推断类型。

generate JSON Schema from JSON 怎么实现?

核心思路是递归遍历 JSON 数据,根据每个值的类型推断对应的 Schema 规则。对于数组,取第一个元素的类型作为 items 的 Schema(实际实现中可能会分析所有元素取并集)。DevToolkit Pro 的 JSON Schema Generator 内置了这套算法,开箱即用。

JSON Schema 可以做表单验证吗?

完全可以。很多前端表单库(如 react-jsonschema-form、uniforms)都支持用 JSON Schema 驱动表单渲染和验证,实现"一份 Schema,同时用于前端表单和后端校验"。

JSON 数据校验只能用 JSON Schema 吗?

不是。JSON Schema 是最通用、语言无关的方案。但如果你只在单一语言中使用,也可以选择该语言生态中更惯用的方案,比如 TypeScript 的 Zod、Python 的 Pydantic、Go 的 validator 等。


本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页


ad