JSON文件Schema验证异常:删除字段仍显示有效,如何修正Schema?
JSON Schema验证失效问题:缺失必填字段仍提示有效,怎么改?
问题重现
使用jsonschema库验证JSON文件时,即使删除JSON对象中的Name、A等字段,验证函数仍返回Given JSON data is Valid。以下是相关代码和JSON示例:
原验证代码
import jsonschema from jsonschema import validate import json # 原代码遗漏json模块导入 my_schema = { 'ID': {'type': 'string'}, 'Country': {'type': 'string'}, 'Name': {'type': 'string'}, 'A': {'type': 'string'}, 'B': {'type': 'string'}, 'C': {'type': 'string'}, 'D': {'type': 'string'} } def validate_json(json_data): try: validate(instance=json_data, schema=my_schema) except jsonschema.exceptions.ValidationError as err: return 'Given JSON data is Invalid' return 'Given JSON data is Valid' def validate_json_syntax(json_file): try: with open(json_file, 'r') as f: data = json.load(f) return validate_json(data) except FileNotFoundError as e: print('Read file: Unsuccessful - %s!' % e) return None file_name = "your_json_file.json" # 替换为实际文件名 print(validate_json_syntax(file_name))
原始JSON数据
[[{"ID": "101", "Country": "UK", "Name": "none", "A": "2", "B": "6", "C": "0", "D": "0"}, {"ID": "102", "Country": "UK", "Name": "bla", "A": "1", "B": "2", "C": "0", "D": "0"}], [{"ID": "110", "Country": "GB", "Name": "nana", "A": "2", "B": "6", "C": "0", "D": "0"}, {"ID": "111", "Country": "GB", "Name": "bla", "A": "1", "B": "3", "C": "0", "D": "0"}] ]
修改后的JSON数据(缺失字段)
[[{"ID": "101", "Country": "UK", "B": "6", "C": "0", "D": "0"}, {"ID": "102", "Country": "UK", "Name": "bla", "A": "1", "B": "2", "C": "0", "D": "0"}], [{"ID": "110", "Country": "GB", "Name": "nana", "A": "2", "B": "6", "C": "0", "D": "0"}, {"ID": "111", "Country": "GB", "Name": "bla", "A": "1", "B": "3", "C": "0", "D": "0"}] ]
问题原因
- Schema结构不规范:原Schema没有遵循jsonschema的标准格式——既没指定
type: "object",也没用properties包裹字段定义,更没有required数组标记必填字段。默认情况下,jsonschema只会校验存在的字段类型,不会检查字段是否必须存在。 - 未匹配二维数组结构:你的JSON是嵌套的二维数组,但原Schema直接验证整个数组,没有对应嵌套结构的校验规则,导致验证逻辑完全不匹配实际数据结构。
修改方案
重新定义Schema,同时满足两个核心要求:匹配JSON的二维数组结构,明确标记所有必填字段。
修改后的完整代码
import jsonschema from jsonschema import validate import json # 单个对象的Schema:定义字段类型和必填项 item_schema = { "type": "object", "properties": { "ID": {"type": "string"}, "Country": {"type": "string"}, "Name": {"type": "string"}, "A": {"type": "string"}, "B": {"type": "string"}, "C": {"type": "string"}, "D": {"type": "string"} }, # 列出所有必须存在的字段,缺失任意一个则验证失败 "required": ["ID", "Country", "Name", "A", "B", "C", "D"] } # 外层二维数组的Schema my_schema = { "type": "array", "items": { "type": "array", "items": item_schema # 内层数组的每个元素必须符合item_schema规则 } } def validate_json(json_data): try: validate(instance=json_data, schema=my_schema) except jsonschema.exceptions.ValidationError as err: return f'Given JSON data is Invalid: {err.message}' return 'Given JSON data is Valid' def validate_json_syntax(json_file): try: with open(json_file, 'r') as f: data = json.load(f) return validate_json(data) except FileNotFoundError as e: print('Read file: Unsuccessful - %s!' % e) return None file_name = "your_json_file.json" print(validate_json_syntax(file_name))
关键修改点说明
item_schema:type: "object"明确这是对象类型的Schemaproperties统一包裹所有字段的类型定义required数组标记所有必须存在的字段,只要缺失其中一个,验证就会抛出错误
my_schema:- 外层定义为
array,items指定外层数组的每个元素也是array - 内层数组的
items指向item_schema,确保内层数组的每个对象都符合字段要求
- 外层定义为
验证效果
使用修改后的代码验证缺失字段的JSON时,会返回类似如下的错误提示:
Given JSON data is Invalid: 'Name' is a required property
内容的提问来源于stack exchange,提问作者FotisK
相关产品推荐
相关产品推荐

