JSON Schema 基础
JSON Schema 的核心概念:如何用 JSON 描述 JSON 数据的结构和约束
什么是 JSON Schema?
JSON Schema 是一种用 JSON 来描述 JSON 结构的规范。
简单说:它是一份「数据说明书」,告诉你一段 JSON 数据「应该长什么样」。
JSON Schema(说明书) JSON 数据(实际数据)
┌─────────────────┐ ┌─────────────────┐
│ type: "object" │ │ { │
│ properties: { │ ───→│ "name": "张三",│ ← 符合说明书
│ name: ... │ │ "age": 25 │
│ } │ │ } │
└─────────────────┘ └─────────────────┘
为什么需要 JSON Schema?
想象你要接收快递,但不提前说清楚尺寸:
❌ 不好的情况:
快递员:给你寄了个「东西」
你:……是多大的?(可能收到一个箱子,也可能收到一个包裹)
✅ 用 JSON Schema 的情况:
快递员:寄一个 30×20×10cm 的纸箱
你:收到 ✓ 尺寸匹配
在 API 中的作用:
核心语法
1. 类型声明
{
"type": "string"
}
常见类型:
| type 值 | 含义 | 示例 |
|---|---|---|
"string" | 文本 | "你好" |
"number" | 数字(整数或小数) | 25, 3.14 |
"integer" | 整数 | 25 |
"boolean" | 布尔值 | true, false |
"object" | 对象 | {"name": "张三"} |
"array" | 数组 | [1, 2, 3] |
"null" | 空值 | null |
2. 对象的结构描述
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "用户姓名"
},
"age": {
"type": "integer",
"description": "用户年龄"
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name", "age"]
}
拆解:
type: "object":这是一个对象properties:定义了对象的每个字段及其类型required:哪些字段必须存在
3. 数组的描述
{
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"maxItems": 10
}
含义:这是一个字符串数组,最少 1 个元素,最多 10 个。
4. 枚举值(固定选项)
{
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
含义:只能是 "celsius" 或 "fahrenheit",不能是其他值。
5. 嵌套结构
{
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {
"name": { "type": "string" },
"contact": {
"type": "object",
"properties": {
"email": { "type": "string" }
}
}
}
}
}
}
类比:这就像一份入职登记表:
- 最外层
{}= 整个登记表 user= 个人信息(又是一个子表格)contact= 联系方式(又是一个子表格)
在 AI API 中的实际应用
OpenAI 的工具定义
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
}
这里 parameters 就是一个完整的 JSON Schema,描述了 get_weather 工具需要什么参数。
Anthropic 的工具定义
{
"name": "get_weather",
"description": "获取指定城市的天气",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
结构是一样的,只是字段名不同(parameters vs input_schema)。
常见约束关键字
| 关键字 | 适用类型 | 含义 | 示例 |
|---|---|---|---|
required | object | 必填字段列表 | ["name", "age"] |
minItems / maxItems | array | 数组最小/最大长度 | "minItems": 1 |
minimum / maximum | number | 数字范围 | "minimum": 0, "maximum": 100 |
minLength / maxLength | string | 字符串长度范围 | "minLength": 1, "maxLength": 100 |
pattern | string | 正则表达式匹配 | "pattern": "^[a-z]+$" |
format | string | 预定义格式 | "format": "email" |
enum | 任意 | 枚举值列表 | "enum": ["a", "b", "c"] |
default | 任意 | 默认值 | "default": "unknown" |
description | 任意 | 字段说明(非约束,但很有用) | "description": "城市名" |
OpenAI 的 strict 模式
OpenAI 的 function 定义支持 strict: true:
{
"type": "function",
"function": {
"name": "get_weather",
"strict": true, // ← 强制严格遵守 Schema
"parameters": { ... }
}
}
开启 strict: true 后:
- 模型必须严格按照 Schema 返回参数
- 不能多传字段,不能少传必填字段
- 类型必须完全匹配
- 不会输出 Schema 中未定义的参数
对比:Anthropic 没有这个开关,默认行为类似于「尽量遵守」,但不保证严格。
验证工具
在实际开发中,你会用 JSON Schema 验证数据:
在线工具:
- jsonschema.net — 可视化生成 Schema
- json-schema.org/implementations.html — 各语言验证库
代码中使用:
# Python
import jsonschema
schema = {"type": "object", "properties": {"name": {"type": "string"}}}
data = {"name": "张三"}
jsonschema.validate(data, schema) # 通过
// JavaScript
import { validate } from 'jsonschema';
const schema = { type: 'object', properties: { name: { type: 'string' } } };
const data = { name: '张三' };
const result = validate(data, schema); // result.valid === true
常见误区
| 误区 | 纠正 |
|---|---|
| JSON Schema 就是 JSON | ❌ Schema 是描述 JSON 的元数据 |
| 所有字段都要写 type | ❌ 没有 type 的字段表示任意类型 |
required 和 properties 必须一起用 | ❌ 可以单独使用 |
description 是约束 | ❌ 它是元数据,不参与验证 |
| Anthropic 和 OpenAI 的 Schema 完全不同 | ❌ 结构一样,只是字段名不同(parameters vs input_schema) |
实战建议
- 先写 Schema,再写代码:把工具定义当作「合同」,前后端都按合同开发
- 善用
description:给每个字段写清楚说明,AI 能更好地理解参数含义 - 必填字段一定要标
required:避免 AI 漏传关键参数 - 用
enum限制选项:减少 AI 的猜测空间,提高准确性 - 测试 Schema:用在线工具或代码验证,确保约束正确
返回 JSON 数据结构基础 了解 JSON 的基本类型和结构 返回 REST API 基础概念 了解 API 请求/响应的整体流程
互链
链接来自概念卡正文里的双链,编译时能解到本期词条集的才成为站内链接。
- JSON 数据结构基础正文引用
- REST API 基础概念正文引用
反链(1)
- 结构化输出正文引用
出现在哪些课时里(0)
判据与「课时正文里能不能点出来」是同一个:那一节确实提到了它。点课时走当前页跳转, 它是导航,不是词条链接。
还没有课时讲到这一条。它是词条跑在课程前面的那一部分,不是错链。
关联图
只画这一条与它直接相连的词条,边与上面两区同源。可拖拽、可缩放,点节点是新标签。
以列表方式看这 4 个节点
出处
路径是本地知识库(Obsidian 库)里的位置,正文与概念卡逐字对应。
- 概念卡原文JSON Schema 基础
03_RESOURCES/概念/json-schema-基础.md - 所属知识地图栏目概念页索引 · API 与后端基础
03_RESOURCES/概念/Index.md - 外部来源jsonschema.net
- 外部来源json-schema.org/implementations.html
编译入库:2026年11月2日。词条由知识库编译而来, 修正要回到概念卡改,再重新编译。