用于验证 JSON 数据是否符合指定 JSON Schema 的函数,并使用断言进行验证结果

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 的函数。下面是对代码的解析:

  1. from jsonschema import validate, draft7_format_checker, SchemaError, ValidationError:导入所需的模块和异常类。

  2. def jsonschema_assert(code, msg, schema, jsonSchema)::定义了一个名为 jsonschema_assert 的函数,它接受四个参数:codemsgschemajsonSchema

    • code:表示代码的一个值,但此处实际上没有使用该参数,因为代码中的 assert 语句总是返回 True
    • msg:表示消息的一个值,但此处实际上没有使用该参数,因为代码中的 assert 语句总是返回 True
    • schema:表示 JSON Schema 的定义,用于验证 JSON 数据的结构和属性。
    • jsonSchema:表示要验证的 JSON 数据。
  3. assert code == codeassert msg == msg:这两行代码实际上没有实际意义,因为它们只是对传入的 codemsg 进行了自我比较,始终会返回 True

  4. try::开始一个 try 块,捕获可能发生的异常。

  5. validate(instance=jsonSchema, schema=schema, format_checker=draft7_format_checker):使用 jsonschema 模块的 validate 函数验证给定的 JSON 数据 jsonSchema 是否符合指定的 JSON Schema schemaformat_checker=draft7_format_checker 表示使用 JSON Schema Draft 7 格式的检查器。

  6. except SchemaError as e::捕获 SchemaError 异常,如果 JSON Schema 的定义有错误,则会抛出该异常。

    • 返回一个元组,第一个元素是 1,表示验证出错;第二个元素是一个错误消息,包含出错位置和提示信息。
  7. except ValidationError as e::捕获 ValidationError 异常,如果 JSON 数据不符合 JSON Schema 的规定,则会抛出该异常。

    • 返回一个元组,第一个元素是 1,表示验证出错;第二个元素是一个错误消息,包含出错字段和提示信息。
  8. 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!"

解析和优化封装的内容如下:
解析:

  1. 首先,代码导入了 jsonschema 模块中的一些必要组件,包括 validate 函数、draft7_format_checker 格式检查器以及 SchemaErrorValidationError 异常类。

  2. jsonschema_assert 函数接受四个参数:codemsgschemajson_data。其中,codemsg 是用于匹配的额外参数,schema 是用于验证的 JSON 模式,json_data 是要验证的 JSON 数据。

  3. 函数使用 validate 函数来验证 json_data 是否符合 schema。如果验证失败,函数会捕获 SchemaErrorValidationError 异常,并返回相应的错误信息。

  4. 如果 schema 验证出错,函数会返回一个元组,第一个元素为 1,表示验证失败;第二个元素为错误信息,包括出错位置和提示信息。

  5. 如果 schema 验证通过,则会继续进行额外的匹配。如果给定的 codemsg 不为空且不匹配实际的 codemsg,函数会返回一个元组,第一个元素为 1,表示验证失败;第二个元素为相应的错误信息。

  6. 如果所有的验证都通过,函数会返回一个元组,第一个元素为 0,表示验证成功;第二个元素为 “success!”,表示成功的提示信息。
    优化部分:

  7. 移除了原代码中多余的 assert 语句,因为它们没有实际作用。

  8. 将参数 jsonSchema 改为更常见的命名 json_data,以更好地描述参数含义。

  9. 优化了返回结果的逻辑,不再要求必须传入 codemsg 参数,并且增加了对它们的验证。如果传入了 codemsg,并且它们不匹配实际值,则返回错误结果。

  10. 将函数返回结果的格式改为一个元组 (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,并提供更清晰的错误提示。你可以根据具体情况使用返回结果来进行后续处理。希望这样解析和优化封装能满足你的需求,如果有任何进一步的问题,请随时提问。

你可能感兴趣的:(json)