JSON Schema

一、什么是 JSON Schema?

JSON Schema 是一种用来描述和验证 JSON 数据格式的规范。你可以把它理解成 JSON 的「说明书 + 校验规则」:

  • 说明书:规定了 JSON 里应该有哪些字段、每个字段是什么类型(字符串 / 数字 / 数组 / 对象 / 空值等)。
  • 校验规则:用来判断一份实际的 JSON 数据,是否符合你定义的格式要求,防止接口返回数据乱套。

在自动化测试里,它特别常用,用来验证接口返回的 JSON 数据结构是否正确。


二、结合代码逐行解释

下面这段代码,定义了一个 JSON Schema,我们一行一行看:

复制代码
json_schema={
    "type": "object",
    "properties": {
        "addr":{
            "type": "null"
        },
        "data": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "age": {
                        "type": "number"
                    }
                }
            }
        }
    }
}

1. 根节点规则

复制代码
"type": "object"

表示:被校验的 JSON 整体必须是一个对象(键值对形式),不能是数组、字符串等其他类型。

2. properties:定义对象里的字段规则

properties 用来描述这个对象里,每个字段的校验规则:

复制代码
"properties": {
    "addr":{ ... },
    "data": { ... }
}

表示这个对象里,至少应该包含 addrdata 这两个字段。


3. 字段 addr 的规则

复制代码
"addr":{
    "type": "null"
}
  • type: "null" 表示:addr 字段的值必须是 null(空值),不能是字符串、数字、对象等其他类型。
  • 比如:"addr": null 是合法的;"addr": "北京" 就是非法的。

4. 字段 data 的规则(重点)

复制代码
"data": {
    "type": "array",
    "items": {
        "type": "object",
        "properties": {
            "name": {
                "type": "string"
            },
            "age": {
                "type": "number"
            }
        }
    }
}

这部分是对数组类型的校验,我们拆开看:

  1. "type": "array"表示:data 字段的值必须是一个数组 ,比如 [][{}, {}] 这种形式。

  2. "items": { ... }用来定义数组里每一个元素的校验规则。

  3. 数组元素的规则:

    复制代码
    "type": "object",
    "properties": {
        "name": { "type": "string" },
        "age": { "type": "number" }
    }

    表示:

    • 数组里的每一个元素,都必须是一个对象;
    • 这个对象里必须有 name 字段,且值为字符串;
    • 这个对象里必须有 age 字段,且值为数字(整数或浮点数都可以)。

三、举个例子:合法 / 非法的 JSON

✅ 符合这个 Schema 的 JSON 示例

复制代码
{
  "addr": null,
  "data": [
    {
      "name": "张三",
      "age": 20
    },
    {
      "name": "李四",
      "age": 25.5
    }
  ]
}

❌ 不符合的例子(随便改一个就会校验失败)

复制代码
{
  "addr": "北京", // 这里不是 null,不合法
  "data": [
    {
      "name": "张三",
      "age": "20" // 这里 age 是字符串,不是数字,不合法
    }
  ]
}

四、Python 里怎么用它做校验?

一般用 jsonschema 库来校验,给你一个可直接运行的例子:

复制代码
from jsonschema import validate

def test_04():
    # 定义你的 schema
    json_schema = {
        "type": "object",
        "properties": {
            "addr": {"type": "null"},
            "data": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "name": {"type": "string"},
                        "age": {"type": "number"}
                    }
                }
            }
        }
    }

    # 模拟接口返回的 JSON 数据
    mock_response = {
        "addr": null,
        "data": [
            {"name": "张三", "age": 20},
            {"name": "李四", "age": 25}
        ]
    }

    # 校验数据是否符合 schema
    validate(instance=mock_response, schema=json_schema)
    print("校验通过!")

如果校验失败,会直接抛出 ValidationError,告诉你哪里不符合规则,非常适合自动化测试。


💡 补充说明:

  • 代码里只写了 properties,默认这些字段不是 "必填" 的。如果想强制要求字段必须存在,需要加上 "required": ["addr", "data"]
  • 除了 type,JSON Schema 还支持很多其他规则,比如字符串的长度、数字的范围、数组的长度、枚举值等。
相关推荐
xiaodaoluanzha3 小时前
golang中MetaMessage(mm)的使用
json·protobuf
小杍随笔4 小时前
【FlyEnv v4.15.0 重磅更新!新增 FrankenPHP、CliProxyAPI、Numa、Rnacos 模块,开发效率再升级】
测试工具·开发环境管理工具
软件测试慧姐5 小时前
软件测试常见面试题汇总(2026版)
软件测试·测试工具·面试
weixin_419658311 天前
基于 Trae 和 Postman-MCP-Server 接口自动化测试
测试工具·postman
星空椰1 天前
从零到实战:一套完整的 Python 爬虫技术体系(requests + BeautifulSoup + 正则 + JSON)
爬虫·python·json·beautifulsoup
A__tao2 天前
JSON 转 Proto 工具(支持嵌套与注释解析)
json
weixin_419658312 天前
Postman-MCP-Server 的构建以及在 Trae 中的配置方法
测试工具·postman
A__tao2 天前
JSON 转 Java 实体类工具(支持嵌套与注释解析)
java·python·json
测试员周周2 天前
【AI测试系统】第6篇:需求扔进去,3 分钟出测试用例?AI测试系统的 RAG 知识增强实战
人工智能·python·功能测试·测试工具·测试用例