zoukankan      html  css  js  c++  java
  • python接口自动化34-json校验神器jsonschema

    前言

    前面一篇讲到json解析神器jsonpath, jsonpath是为了方便快速取值,如果我们要校验json的字段类型和格式,就不是那边方便了。
    比如当接口返回一个token,这个token值不是固定的,就算取到了也不好断言,这时候我们希望断言的是token的类型是字符串,长度是固定多少位。

    jsonschema

    先安装 jsonschema 依赖包

    pip install jsonschema

    jsonschema 是基于JSON格式,用于定义 JSON 数据结构以及校验 JSON 数据内容。支持python2.7+和python3+
    jsonschema 参考文档地址:https://python-jsonschema.readthedocs.io/en/latest/

    >>> from jsonschema import validate
    
    >>> # A sample schema, like what we'd get from json.load()
    >>> schema = {
    ...     "type" : "object",
    ...     "properties" : {
    ...         "price" : {"type" : "number"},
    ...         "name" : {"type" : "string"},
    ...     },
    ... }
    
    >>> # If no exception is raised by validate(), the instance is valid.
    >>> validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)
    
    >>> validate(
    ...     instance={"name" : "Eggs", "price" : "Invalid"}, schema=schema,
    ... )                                   
    Traceback (most recent call last):
        ...
    ValidationError: 'Invalid' is not of type 'number'
    

    也可以支持命令行执行

    $ jsonschema -i sample.json sample.schema

    完全支持 Draft 7, Draft 6, Draft 4Draft 3

    使用示例

    如下带有token的校验,由于token的值不固定,它是一个40位长度的16进制,0-9和a-f生成的字符串,可以用正则匹配

    from jsonschema import validate
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    # 需要校验的内容
    result = {
        "code": 0,
        "msg": "login success!",
        "token": "000038efc7edc7438d781b0775eeaa009cb64865",
        "username": "test"
    }
    
    
    # 编写schema 内容
    
    schema = {
        "$schema": "http://json-schema.org/draft-04/schema#",
        "title": "test demo",
        "description": "validate result information",
        "type": "object",
        "properties": {
            "code": {
                "description": "error code",
                "type": "integer"
            },
            "msg": {
                "description": "error msg ",
                "type": "string"
            },
            "token":
            {
                "description": "login success return token",
                "maxLength": 40,
                "pattern": "^[a-f0-9]{40}$",  # 正则校验a-f0-9的16进制,总长度40
                "type": "string"
            }
        },
        "required": [
            "code", "msg", "token"
        ]
    }
    
    # 校验, 跟assert断言一个意思
    validate(instance=result, schema=schema)
    

    validate 校验成功时候,不会有报错

    • JSON 数据校验失败,抛出 jsonschema.exceptions.ValidationError 异常
    • schema 模式本身有问题,抛出 jsonschema.exceptions.SchemaError 异常

    schema语法

    参数 描述
    $schema 表示该JSON Schema文件遵循的规范
    title 为该JSON Schema文件提供一个标题
    description 关于该JSON Schema文件的描述信息
    type 表示待校验元素的类型(例如,最外层的type表示待校验的是一个JSON对象,内层type分别表示待校验的元素类型为,整数,字符串,数字)
    properties 定义待校验的JSON对象中,各个key-value对中value的限制条件
    required 定义待校验的JSON对象中,必须存在的key
    minimum 用于约束取值范围,表示取值范围应该大于或等于minimum
    exclusiveMinimum 如果minimum和exclusiveMinimum同时存在,且exclusiveMinimum的值为true,则表示取值范围只能大于minimum
    maximum 用于约束取值范围,表示取值范围应该小于或等于maximum
    exclusiveMaximum 如果maximum和exclusiveMaximum同时存在,且exclusiveMaximum的值为true,则表示取值范围只能小于maximum
    multipleOf 用于约束取值,表示取值必须能够被multipleOf所指定的值整除
    maxLength 字符串类型数据的最大长度
    minLength 字符串类型数据的最小长度
    pattern 使用正则表达式约束字符串类型数据

    type取值

    type取值 python数据类型
    object dict
    array list
    integer int
    number float或int
    null None
    boolean bool
    string str
  • 相关阅读:
    Springboot(一)springboot简介与入门程序
    Java基础(二)流程语句与数组
    Java基础(一)基础常识
    Kubernetes介绍
    K8s 存储
    Kubernetes 集群组件
    Kubernetes 设计理念
    Kubernetes 部署与实战
    容器技术与资源隔离
    Docker 网络配置
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/13221771.html
Copyright © 2011-2022 走看看