【接口自动化】(3) YAML 和 JSON Schema

一、YAML

1、简介

YAML 文件后缀为**.yaml、.yml** ,常用于配置文件的编写语法。JSON 格式更规范,适合机器读;YAML 更简约,适合人读写。

  • JSON 文件引号多、大括号多、逗号多、字符串换行要加换行符、不能直接注释(想要注释还需要特殊的方法)。
  • YAML 文件没有大括号、逗号,可以省略引号,多行字符串直接换行、可以注释。空格缩进表示层级(多2个空格表示进一层。YAML 不能有 tab,有些编辑器会自动把 tab 转为空格)。

2、语法

可以用在线工具,把 JSON 转为 YAML。

XML 复制代码
int_key: 123 # 整数
float_key: 1.23 # 浮点数
string_key: # 字符串
  字符串1
  字符串2
  字符串3
string_key2: "123" # 像数字的字符串,要加引号
list_key: # 列表
  - item1
  - item2
  - item3
map_key: # 字典
  sub_key1: value1
  sub_key2: value2

3、YAML 文件的读写

(1)下载 YAML

XML 复制代码
pip install PyYAML==6.0.1

(2)示例代码

python 复制代码
import pytest
import yaml

pytestmark = pytest.mark.test0408


# 追加写⼊
def write_yaml(filename, data):
    with open(filename, encoding="utf-8", mode="a") as f:
        yaml.safe_dump(data, stream=f)


# 读取
def read_yaml(filename, key):
    with open(filename, encoding="utf-8", mode="r") as f:
        data = yaml.safe_load(f)
    return data[key]


# 清空
def clear_yaml(filename):
    with open(filename, encoding="utf-8", mode="w") as f:
        f.truncate()  # 从文件开头,往后移动 0 个字节,其后的所有内容


def test_yml():
    # 定义 Python 字典
    data = {
        "int_key": 123,  # 整数
        "float_key": 1.23,  # 浮点数
        "string_key": "字符串1\n字符串2\n字符串3",  # 多行字符串
        "string_key2": "123",  # 加引号的字符串
        "list_key": ["item1", "item2", "item3"],  # 列表
        "map_key": {  # 字典
            "sub_key1": "value1",
            "sub_key2": "value2"
        }
    }
    # 写⼊yaml⽂件
    write_yaml('test.yml', data)
    # 读取 yaml ⽂件的 map_key 关键字
    map_data = read_yaml('test.yml', "map_key")
    # 再从字典里取 sub_key1
    sub_value = map_data["sub_key1"]
    print("sub_key1 的值:", sub_value)
    print("string_key 的值:", read_yaml('test.yml', "string_key"))
    # 清空yaml⽂件
    clear_yaml('test.yml')

结果:

二、JSON Schema

1、简介

JSON Schema 是用来校验和约束自定义 JSON 的规范。可以用不同编程语言提供的验证器,将定义的 JSON Schema 对 JSON 进行校验。

JSON Schema 和 JSON 也可以用在线转换器互相转换,但需要自行校验一遍。

2、安装验证器

python 复制代码
pip install jsonschema==4.23.0

3、语法

(1)数据类型 type

指定每个属性的数据类型:

(2)最大和最小值

给属性的值约束大小范围:

(3)字符串值校验

  • pattern:用正则表达式校验字符串属性的值。
  • 正则表达式:
  • 示例:aaabbb
  • a.+b:匹配到最后一个b,aaabbb。
  • a.+?b:匹配到第一个b就停止,aaab。

(4)数组值约束

示例:YAML 格式

python 复制代码
type: array
minItems: 2       # 数组至少2个元素
maxItems: 5       # 数组最多5个元素
uniqueItems: true # 元素不能重复
items:            # 每个元素必须是字符串
  type: string

(5)对象值的约束

示例:

python 复制代码
type: object
properties:
  name:
    type: string
  age:
    type: integer
minProperties: 1       # 至少1个属性
maxProperties: 3       # 最多3个属性
additionalProperties: false  # 不允许有 name、age 额外属性

(6)必须属性

  • required:约束哪些属性是必须要有的。
  • 示例:
python 复制代码
type: object
properties:
  # 定义对象的属性
  字段名1:
    type: 类型
  字段名2:
    type: 类型
required:
  - 字段名1  # 字段名1、字段名2,必须要有
  - 字段名2

(7)依赖关系

  • dependentRequired:定义某个属性存在,必须依赖哪些属性的存在。
  • 示例:
python 复制代码
type: object
# 定义所有属性
properties:
  name:
    type: string
  id_card:
    type: string
  address:
    type: string
# 依赖规则
dependentRequired:
  # 规则1:如果有 "name",则必须包含 "id_card"
  name: ["id_card"]
  # 规则2:如果有 "id_card",则必须包含 "address"
  id_card: ["address"]

4、校验 JSON 示例代码

python 复制代码
def test_json():
    # 接口返回结构对应的 schema
    schema = {
        "type": "object",
        "required": ["userId", "id", "title", "body"],
        "properties": {
            "userId": {"type": "number"},
            "id": {"type": "number"},
            "title": {"type": "string"},
            "body": {"type": "string"}
        }
    }

    # 模拟 JSON 响应的网站
    url = "https://jsonplaceholder.typicode.com/posts/1"

    r = requests.get(url)
    print("返回数据:", r.json())

    # 校验
    validate(instance=r.json(), schema=schema)
    print("✅ 校验通过!")
相关推荐
AI_零食2 小时前
Flutter 框架跨平台鸿蒙开发 - 社交断舍离应用
运维·服务器·学习·flutter·游戏·开源·harmonyos
gwjcloud2 小时前
Ansible自动化运维工具
运维·自动化·ansible
D4c-lovetrain2 小时前
linux实战之多配置部署(ansible、nginx、keepalived、dhcp、dns多元化操作)
linux·运维·服务器
147API2 小时前
Claude 4.6 API 接入全流程避坑:OpenAI 迁移、长上下文超时、429 限流一次讲清
运维·服务器·网络·claude·api大模型
CDN3602 小时前
高防服务器无法远程连接?端口、防火墙与安全组排查
运维·服务器·安全
我爱学习好爱好爱2 小时前
Ansible force_handlers delegate委托 playbook语法格式 template模块
linux·运维·ansible
wzl202612132 小时前
自动化脚本模拟人工操作 — 基于RPA绕过企微API次数限制
自动化·企业微信·rpa
CDN3602 小时前
高防服务器被攻击后 IP 被封?黑洞解封与清洗策略设置
运维·服务器·tcp/ip
2401_827499992 小时前
python项目实战07-DeepSeek调用测试(本地部署)
linux·运维·服务器