如何在Python中验证含固定键与自定义键的JSON Schema
JSON Schema验证:固定键、自定义键及嵌套结构处理方案
需求说明
需要验证用户提交的JSON文件,要求:
- 固定键(
a、b、c、d)格式合规 - 自定义键(如
c下的custom_a、custom_b)的值必须符合指定格式(字典列表) - 处理嵌套结构:字典列表、包含字典列表的自定义键对象
示例JSON结构
{ "a": "some value", "b": "some value", "c": { "custom_a": [{"key1": "val1"}, {"key2": "val2"}], "custom_b": [{"id": 1}, {"id": 2}] }, "d": [{"name": "test"}, {"name": "demo"}] }
之前的错误尝试
尝试1:语法错误的Schema定义
import json from jsonschema import validate my_json = json.loads(<符合上述结构的JSON字符串>) schema = { "a" : {"type": "string"}, "b" : {"type": "string"}, "c" : {[{}]}, # 语法错误,Schema必须是标准JSON结构 "d": [{}] # 同样错误,数组不能直接作为Schema值 } validate(instance=my_json, schema=schema) # 触发TypeError
问题:Schema定义不符合JSON Schema规范,不能直接用{[{}]}或[{}]表示类型,必须用标准的类型声明字段。
尝试2:未正确定义嵌套结构
schema = { "a" : {"type": "string"}, "b" : {"type": "string"}, "c" : { "Unsure what to define here": {"type": "list"} # 错误:不能用具体键名匹配自定义键,且未定义列表元素结构 }, "d": {"type": "list"} # 错误:仅声明类型为列表,但未定义列表内字典的结构 }
问题:无法匹配c下的任意自定义键,也未明确列表元素(字典)的验证规则。
正确解决方案
JSON Schema的核心是用标准关键字声明结构:
- 用
type: object定义对象,properties声明固定键的规则 - 用
type: array定义列表,items声明列表元素的结构 - 用
patternProperties匹配自定义键(支持正则匹配键名),additionalProperties限制自定义键的取值规则
完整验证代码
import json from jsonschema import validate # 示例JSON sample_json = ''' { "a": "some value", "b": "some value", "c": { "custom_a": [{"key1": "val1"}, {"key2": "val2"}], "custom_b": [{"id": 1}, {"id": 2}] }, "d": [{"name": "test"}, {"name": "demo"}] } ''' my_json = json.loads(sample_json) # 定义Schema schema = { "type": "object", "required": ["a", "b", "c", "d"], # 指定必填的固定键 "properties": { "a": {"type": "string"}, "b": {"type": "string"}, # 处理d字段:字典列表 "d": { "type": "array", "items": { "type": "object", # 如果需要限制字典的键,可添加properties/required,否则留空表示任意字典 "additionalProperties": True } }, # 处理c字段:包含自定义键的对象,每个值是字典列表 "c": { "type": "object", # 匹配所有自定义键(正则^.*$表示任意键名) "patternProperties": { "^.*$": { "type": "array", "items": { "type": "object", "additionalProperties": True # 允许字典内任意键值,如需限制可添加规则 } } }, # 禁止c字段出现非自定义的固定键(可选,根据需求调整) "additionalProperties": False } }, # 禁止根对象出现额外的未声明键(可选) "additionalProperties": False } # 执行验证 validate(instance=my_json, schema=schema)
关键规则说明
- 固定键验证:通过
properties声明每个固定键的类型(如a、b为字符串),required指定必须存在的键。 - 字典列表(d字段):用
type: array声明列表,items里定义每个元素是object,可通过properties进一步限制字典的键值规则。 - 自定义键对象(c字段):
patternProperties:用正则匹配所有自定义键(^.*$匹配任意键名),并定义对应值的规则(字典列表)。additionalProperties: False:确保c下只有符合规则的自定义键,禁止额外的未匹配键(按需开启)。
内容的提问来源于stack exchange,提问作者RoyalSwish
相关产品推荐
相关产品推荐

