一、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("✅ 校验通过!")