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 还支持很多其他规则,比如字符串的长度、数字的范围、数组的长度、枚举值等。
相关推荐
NiceCloud喜云7 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
海兰8 小时前
Kibana Dashboard as Code:Elastic 9.4 如何用 Terraform 和类型化 API 终结“JSON 垃圾袋“
云原生·json·terraform
程序员小远11 小时前
系统性能指标全解析
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
@我们的天空11 小时前
Claude Code + GLM-5 深度赋能测试:开发 8 大 Skill 构建 AI 测试助手集群
人工智能·python·测试工具·自动化·ai编程
前网易架构师-高司机16 小时前
带标注的交警识别数据集,可识别交警和非交警,5587张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·交警
●VON16 小时前
鸿蒙Flutter实战:放弃sqflite选纯Dart JSON文件存储
flutter·华为·json·harmonyos·鸿蒙
MageGojo18 小时前
给起名工具接入八字起名 API:参数设计、JSON 示例和应用场景
json·apache
jieyucx18 小时前
Go 语言 JSON 序列化/反序列化:Tag 用法完全指南
开发语言·golang·json·序列化·tag
PhotonixBay19 小时前
激光共聚焦与白光干涉仪在PCB表面轮廓测量中的原理与数据对比
人工智能·测试工具·制造