Python 第三方模块之 jsonschema - JSON 模式规范

Github 地址:https://github.com/python-jsonschema/jsonschema

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于数据传输和配置文件。为了确保 JSON 数据的有效性和一致性,需要使用 JSON Schema 来定义数据结构和验证规则。Python中的 jsonschema 库提供了强大的工具,用于验证和验证 JSON 数据

什么是Python jsonschema

JSON Schema 是一种用于描述 JSON 数据结构和验证规则的语言。它可以定义 JSON 数据的期望结构、数据类型、最小和最大值等规则,并用于验证输入数据是否符合这些规则。Python 中的 jsonschema 库是一个用于验证 JSON 数据的工具,它实现了 JSON Schema 规范,可以轻松验证和验证 JSON 数据。

Python jsonschema 的特点

  • 遵循 JSON Schema 规范:jsonschema 库遵循 JSON Schema 规范,与其他遵循同一规范的工具兼容。

  • 强大的验证功能:jsonschema 库支持各种验证功能,包括类型验证、枚举验证、最小和最大值验证、依赖关系验证等。

  • 易于使用的 API:jsonschema 提供了易于使用的 Python API,使验证 JSON 数据变得简单且可读性强。

  • 自定义错误消息:您可以为验证失败的情况定义自定义错误消息,以便更好地了解问题所在。

安装Python jsonschema

1
pip install jsonschema

基本用法

定义 JSON Schema

需要定义一个 JSON Schema,以描述 JSON 数据的结构和验证规则。JSON Schema 通常以 JSON 格式表示。

以下是一个简单的 JSON Schema 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"age": {
"type": "integer",
"minimum": 0
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name", "age"]
}

上述J SON Schema 定义了一个对象,其中包含三个属性:nameageemail。它还指定了验证规则,例如 name 必须为字符串、age 必须为非负整数等。

验证 JSON 数据

定义了 JSON Schema,就可以使用 jsonschema 库来验证 JSON 数据是否符合该模式。

以下是一个验证 JSON 数据的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import jsonschema
from jsonschema import validate

# 定义JSON Schema
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "age"]
}

# 待验证的JSON数据
data = {
"name": "Alice",
"age": 30,
"email": "alice@example.com"
}

# 验证JSON数据是否符合JSON Schema
try:
validate(instance=data, schema=schema)
print("JSON 数据有效")
except jsonschema.exceptions.ValidationError as e:
print("JSON 数据无效:", e)

在上述示例中,使用 validate 函数来验证 JSON 数据是否符合给定的 JSON Schema。如果 JSON 数据有效,则不会引发异常;否则,将引发 jsonschema.exceptions.ValidationError 异常,并提供有关验证失败的详细信息。

高级用法

自定义错误消息

jsonschema 可以为验证失败的情况定义自定义错误消息,以便更好地了解问题所在。

以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import jsonschema
from jsonschema import validate

# 定义JSON Schema
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "age"]
}

# 待验证的JSON数据
data = {
"name": "Alice",
"age": -5,
"email": "invalid_email"
}

# 自定义错误消息
custom_error_messages = {
"type": "属性 '{instance_path}' 的类型必须为 '{expected}',但实际类型为 '{actual}'",
"minimum": "属性 '{instance_path}' 的值不能小于 {min}"
}

# 验证JSON数据是否符合JSON Schema,并提供自定义错误消息
try:
validate(instance=data, schema=schema, error=custom_error_messages)
print("JSON 数据有效")
except jsonschema.exceptions.ValidationError as e:
print("JSON 数据无效:", e)

在上述示例中,使用 error 参数来提供自定义错误消息,以覆盖默认的错误消息。这有助于更清晰地指示问题所在。

多个JSON Schema

有时,可能需要使用多个不同的 JSON Schema 来验证不同类型的 JSON 数据。jsonschema 可以创建多个 Schema 并按需使用它们。

以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import jsonschema
from jsonschema import validate

# 定义两个不同的JSON Schema
schema1 = {
"type": "object",
"properties": {
"name": {"type": "string"}
}
}

schema2 = {
"type": "object",
"properties": {
"age": {"type": "integer", "minimum": 0}
}
}

# 待验证的JSON数据
data1 = {"name": "Alice"}
data2 = {"age": -5}

# 使用第一个JSON Schema验证第一个数据
try:
validate(instance=data1, schema=schema1)
print("JSON 数据1 有效")
except jsonschema.exceptions.ValidationError as e:
print("JSON 数据1 无效:", e)

# 使用第二个JSON Schema验证第二个数据
try:
validate(instance=data2, schema=schema2)
print("JSON 数据2 有效")
except jsonschema.exceptions.ValidationError as e:
print("JSON 数据2 无效:", e)

Python 第三方模块之 jsonschema - JSON 模式规范
https://flepeng.github.io/021-Python-31-Python-第三方模块-Python-第三方模块之-jsonschema-JSON-模式规范/
作者
Lepeng
发布于
2021年4月27日
许可协议