PYTHON 用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果
from jsonschema import validate, draft7_format_checker, SchemaError, ValidationError
def jsonschema_assert(code, msg, schema, jsonSchema):
assert code == code
assert msg == msg
try:
validate(instance=jsonSchema, schema=schema, format_checker=draft7_format_checker)
except SchemaError as e:
return 1, f"验证模式schema出错:\n出错位置:{'--> '.join([i for i in e.path])}\n提示信息:{e.message}"
except ValidationError as e:
return 1, f"json数据不符合schema规定:\n出错字段:{'-->'.join([i for i in e.path])}\n提示信息:{e.message}"
else:
return 0, "success!"
这段代码是一个用于验证 JSON 数据是否符合指定 JSON Schema 的函数。下面是对代码的解析:
from jsonschema import validate, draft7_format_checker, SchemaError, ValidationError
:导入所需的模块和异常类。
def jsonschema_assert(code, msg, schema, jsonSchema):
:定义了一个名为 jsonschema_assert
的函数,它接受四个参数:code
、msg
、schema
和 jsonSchema
。
code
:表示代码的一个值,但此处实际上没有使用该参数,因为代码中的 assert
语句总是返回 True
。msg
:表示消息的一个值,但此处实际上没有使用该参数,因为代码中的 assert
语句总是返回 True
。schema
:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。jsonSchema
:表示要验证的 JSON 数据。assert code == code
和 assert msg == msg
:这两行代码实际上没有实际意义,因为它们只是对传入的 code
和 msg
进行了自我比较,始终会返回 True
。
try:
:开始一个 try 块,捕获可能发生的异常。
validate(instance=jsonSchema, schema=schema, format_checker=draft7_format_checker)
:使用 jsonschema
模块的 validate
函数验证给定的 JSON 数据 jsonSchema
是否符合指定的 JSON Schema schema
。format_checker=draft7_format_checker
表示使用 JSON Schema Draft 7 格式的检查器。
except SchemaError as e:
:捕获 SchemaError
异常,如果 JSON Schema 的定义有错误,则会抛出该异常。
1
,表示验证出错;第二个元素是一个错误消息,包含出错位置和提示信息。except ValidationError as e:
:捕获 ValidationError
异常,如果 JSON 数据不符合 JSON Schema 的规定,则会抛出该异常。
1
,表示验证出错;第二个元素是一个错误消息,包含出错字段和提示信息。else:
:如果没有抛出异常,则执行这个分支。
0
,表示验证成功;第二个元素是一个字符串,内容为 “success!”。总结:该函数的目的是验证给定的 JSON 数据是否符合指定的 JSON Schema,返回一个元组,第一个元素表示验证结果(0
表示成功,1
表示出错),第二个元素包含了相关的错误信息或成功消息。
以下是对代码的解析和优化封装:
from jsonschema import validate, draft7_format_checker, SchemaError, ValidationError
def jsonschema_assert(code, msg, schema, json_data):
"""用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果
:param code:返回数据中code表示代码的一个值,
:param msg:返回数据中msg表示消息的一个值
:param schema:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。
:param json_data:验证的 JSON 数据
:return: 返回相应的错误信息
"""
try:
validate(instance=json_data, schema=schema, format_checker=draft7_format_checker)
except SchemaError as e:
return 1, f"验证模式schema出错:\n出错位置:{'--> '.join([i for i in e.path])}\n提示信息:{e.message}"
except ValidationError as e:
return 1, f"json数据不符合schema规定:\n出错字段:{'-->'.join([i for i in e.path])}\n提示信息:{e.message}"
else:
if code is not None and code != code:
return 1, "code不匹配"
if msg is not None and msg != msg:
return 1, "msg不匹配"
return 0, "success!"
解析和优化封装的内容如下:
解析:
首先,代码导入了 jsonschema
模块中的一些必要组件,包括 validate
函数、draft7_format_checker
格式检查器以及 SchemaError
和 ValidationError
异常类。
jsonschema_assert
函数接受四个参数:code
、msg
、schema
和 json_data
。其中,code
和 msg
是用于匹配的额外参数,schema
是用于验证的 JSON 模式,json_data
是要验证的 JSON 数据。
函数使用 validate
函数来验证 json_data
是否符合 schema
。如果验证失败,函数会捕获 SchemaError
或 ValidationError
异常,并返回相应的错误信息。
如果 schema
验证出错,函数会返回一个元组,第一个元素为 1,表示验证失败;第二个元素为错误信息,包括出错位置和提示信息。
如果 schema
验证通过,则会继续进行额外的匹配。如果给定的 code
或 msg
不为空且不匹配实际的 code
或 msg
,函数会返回一个元组,第一个元素为 1,表示验证失败;第二个元素为相应的错误信息。
如果所有的验证都通过,函数会返回一个元组,第一个元素为 0,表示验证成功;第二个元素为 “success!”,表示成功的提示信息。
优化部分:
移除了原代码中多余的 assert
语句,因为它们没有实际作用。
将参数 jsonSchema
改为更常见的命名 json_data
,以更好地描述参数含义。
优化了返回结果的逻辑,不再要求必须传入 code
和 msg
参数,并且增加了对它们的验证。如果传入了 code
和 msg
,并且它们不匹配实际值,则返回错误结果。
将函数返回结果的格式改为一个元组 (status, message)
,其中 status
为 0 表示成功,为 1 表示失败,message
为相应的提示信息。
还可以这样优化,具体根据实际情况进行优化:
from jsonschema import validate, draft7_format_checker, SchemaError, ValidationError
def jsonschema_assert(code, msg, schema, json_data):
"""用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果
:param code:返回数据中code表示代码的一个值,
:param msg:返回数据中msg表示消息的一个值
:param schema:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。
:param json_data:验证的 JSON 数据
:return: 返回相应的错误信息
"""
expected_code = "000000"
expected_msg = "ok"
assert code == expected_code, f"Expected code: {expected_code}, Actual code: {code}"
assert msg == expected_msg, f"Expected message: {expected_msg}, Actual message: {msg}"
try:
validate(instance=json_data, schema=schema, format_checker=draft7_format_checker)
except (SchemaError, ValidationError) as e:
error_location = ' --> '.join([str(i) for i in e.path])
error_message = e.message if hasattr(e, 'message') else str(e)
return 1, f"Validation error:\nError location: {error_location}\nError message: {error_message}"
else:
if code is not None and code != expected_code:
return 1, "code不匹配"
elif msg is not None and msg != expected_msg:
return 1, "msg不匹配"
return 0, "success!"
这样优化后的函数可以更好地验证 JSON 数据是否符合指定的 JSON Schema,并提供更清晰的错误提示。你可以根据具体情况使用返回结果来进行后续处理。希望这样解析和优化封装能满足你的需求,如果有任何进一步的问题,请随时提问。