PYTHON 用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果
from jsonschema import validate, draft7_format_checker, SchemaError, ValidationErrordef jsonschema_assert(code, msg, schema, jsonSchema):assert code == codeassert msg == msgtry: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 Schemaschema。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, ValidationErrordef 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, ValidationErrordef 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,并提供更清晰的错误提示。你可以根据具体情况使用返回结果来进行后续处理。希望这样解析和优化封装能满足你的需求,如果有任何进一步的问题,请随时提问。