一文看懂 JSON Schema:让“杂乱 JSON”变得可控

53 阅读4分钟

诸神缄默不语-个人技术博文与视频目录

很多刚接触编程、数据处理或大模型 API 的同学,都会遇到一个共同的问题:

JSON 看起来很自由,但也太自由了。

你永远不知道:

  • 某个字段到底是不是必填

  • 一个值到底应该是字符串还是数字

  • 一个数组里应该放什么结构

  • 数据格式什么时候算“合法”

这时候,JSON Schema 就派上用场了。

一、JSON 和 JSON Schema 各是干嘛的?

1️⃣ JSON 是“数据本身”

JSON 是一种数据表示格式,比如:

{
  "name": "张三",
  "age": 18,
  "skills": ["Python", "SQL"]
}

它只负责 “长什么样”,不负责:

  • 合不合法

  • 字段全不全

  • 类型对不对

2️⃣ JSON Schema 是“规则说明书”

JSON Schema 本质上是:

用 JSON 写的一份“JSON 规则文档”

它用来描述:

  • 哪些字段必须有

  • 每个字段的类型

  • 数值范围、字符串长度

  • 数组里元素的结构

一句话总结:

JSON = 数据 JSON Schema = 数据的法律

二、一个直观例子:为什么需要 JSON Schema?

假设你希望接收这样的用户信息:

{
  "name": "李四",
  "age": 25,
  "email": "lisi@example.com"
}

你希望:

  • name:必须是字符串,必填

  • age:必须是整数,且 ≥ 0

  • email:必须是合法邮箱

如果没有 JSON Schema,你只能:

  • 写一堆 if 判断

  • 到处 try / except

  • 靠文档和约定“祈祷别人别乱传”

JSON Schema 的目标就是:把这些规则写成一份统一、可校验的规范

三、最简单的 JSON Schema 长什么样?

下面是一个完整但非常基础的 JSON Schema:

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

我们一条条解释。

1️⃣ type:整体数据类型

"type": "object"

说明:

整个 JSON 必须是一个对象(即 {}

2️⃣ properties:字段定义

"properties": {
  "name": { "type": "string" },
  "age":  { "type": "integer" }
}

含义:

  • 允许有哪些字段

  • 每个字段的类型是什么

常见类型包括:

  • string

  • number

  • integer

  • boolean

  • object

  • array

  • null

3️⃣ required:必填字段

"required": ["name", "age"]

含义:

  • 如果缺少其中任何一个字段 → 不合法

四、用 Python 3 校验 JSON 是否符合 Schema

理论讲完了,我们来真正用起来

1️⃣ 安装依赖

JSON Schema 在 Python 中的主流库是 jsonschema

pip install jsonschema

2️⃣ 一个完整的 Python 示例

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age":  {"type": "integer", "minimum": 0}
    },
    "required": ["name", "age"]
}

data = {
    "name": "王五",
    "age": 20
}

try:
    validate(instance=data, schema=schema)
    print("数据合法 ✅")
except ValidationError as e:
    print("数据不合法 ❌")
    print(e)

运行结果:

数据合法 ✅

3️⃣ 如果数据不合法会怎样?

bad_data = {
    "name": "赵六",
    "age": -5
}

validate(instance=bad_data, schema=schema)

报错信息会明确告诉你:

  • 哪个字段

  • 为什么不符合规则

五、常见 Schema 能力速查表(非常实用)

1️⃣ 数值限制

{
  "type": "integer",
  "minimum": 0,
  "maximum": 120
}

2️⃣ 字符串限制

{
  "type": "string",
  "minLength": 1,
  "maxLength": 50
}

3️⃣ 正则校验(如邮箱)

{
  "type": "string",
  "pattern": "^[^@]+@[^@]+\\.[^@]+$"
}

4️⃣ 枚举值(只能选固定几种)

{
  "type": "string",
  "enum": ["male", "female", "unknown"]
}

5️⃣ 数组结构

{
  "type": "array",
  "items": {
    "type": "string"
  }
}

表示:

一个字符串数组

6️⃣ 嵌套对象(非常常见)

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

六、JSON Schema 在真实项目中的典型用途

对小白来说,理解“我什么时候会用到它”非常重要。

✅ 1. 后端接口参数校验

  • 前端 → 后端

  • 客户端 → 服务端

  • 第三方调用接口

JSON Schema = 自动化参数检查器

✅ 2. 配置文件校验

比如:

{
  "db_host": "localhost",
  "db_port": 3306
}

用 Schema 保证:

  • 字段全

  • 类型对

  • 配置不乱写

✅ 3. 大模型 / Agent / Function Calling

你现在如果在玩:

  • OpenAI function calling

  • Tool calling

  • Agent 输入输出规范

你会发现:

JSON Schema 几乎是“官方语言”

✅ 4. 自动生成文档 & UI

很多工具可以:

  • 根据 JSON Schema 自动生成表单

  • 自动生成接口文档

  • 自动校验输入

七、给初学者的几点实用建议

1️⃣ 别一开始就写很复杂的 Schema

先解决:

  • 必填字段

  • 基本类型

2️⃣ Schema 也是可以“演进”的

就像代码版本一样,慢慢加约束

3️⃣ 错误信息是朋友,不是敌人

JSON Schema 的报错非常详细,适合调试

八、总结一句话

JSON 负责表达数据

JSON Schema 负责约束数据

Python 负责执行规则

如果你:

  • 在写接口

  • 在做数据清洗

  • 在用大模型

  • 在做配置管理

那 JSON Schema 非常值得你认真学一次