使用jsonschema校驗json數據


https://www.jianshu.com/p/e750ff6962b7

http://www.jianshu.com/p/ec40734c872a 

 

jsonschema用來標記和校驗json數據,可在自動化測試中驗證json的整體結構和字段類型

在線jsonschema 轉換:https://jsonschema.net/#/

首先,了解一下json的數據類型和schema語法

最外層字段

參數 描述
$schema json schema文件遵守的規范
title json schema文件的標題
description json schema文件的描述信息

object

參數 描述
properties 定義待校驗的json對象中,各key-value對中value的限制條件
required 待校驗的json對象中,必須存在的key

string

參數 描述
maxLength 字符串類型數據的最大長度
minLength 字符串類型數據的最小長度
pattern 使用正則表達式約束字符串類型數據
enum 枚舉約束

number

參數 描述
minimum 用於約束取值范圍,取值范圍大於等於minimum
maximum 用於約束取值范圍,取值范圍小於等於minimum
exclusiveMinimum 如果minimum和exclusiveMinimum同時存在,且exclusiveMinimum的值為true,則表示取值范圍只能大於minimum
exclusiveMaximum 如果maximum和exclusiveMaximum同時存在,且exclusiveMaximum的值為true,則表示取值范圍只能小於maximum
multipleOf 用於約束取值,表示取值必須能夠被multipleOf所指定的值整除

array

參數 描述
items 子元素
required 必須子元素
minitems 最少子元素個數
maxitems 最大子元素個數
uniqueItems 每個元素都不相同,唯一

通用

參數 描述
type 待校驗元素的類型,可為:object,string,null,integer,number,array,boolean

內部引用

  • definitions用來定義公共約束
  • $ref用來引用definitions中定義的約束

其中,聚合關鍵字allOf,anyOf,oneOf,not

  • allOf 必須滿足所有的約束才算通過
  • anyOf 必須滿足任意一個或多個約束才算通過
  • oneOf 必須滿足任意一個約束才算通過
    -not 不滿足約束條件
基本使用

需校驗的json數據:

{ "code":200, "message":"測試通過", "data":{ "data1":"test", "data2":["test1","test2"] } } 

整個json結構可描述為,整體為object類型,包含code,message,data四個屬性,其中data為object類型,其中data1為array數組類型,code和message為字符串類型,使用jsonschema描述,如下:

{ "definitions":{ "data":{ "anyof":[ {"type":"string"}, {"pattern":"^test$"}]} }, "type":"object", "properties":{ "code":{ "type":"integer" }, "message":{ "type":"string", "pattern":"^測試通過$" }, "data":{ "type":"object", "required":[ "data1", "data2" ], "properties":{ "data1":{"$ref":"#/definitions/data"}, "data2":{ "type":"array", "items":{"type":"string"}, "minItems":1, "maxItems":2, "uniqueItems":True } } } } } 
  • validate校驗成功時,不會有報錯
  • json數據校驗失敗時,拋出jsonschema.exceptions.ValidationError異常
  • schema模式本身有問題時,拋出jsonschema.exceptions.SchemaError異常
 
安裝:
pip install jsonschema
 

校驗的參數為字符串、數字、列表、必填項

from jsonschema  import  validate
schema = {
    "type": "object",
    "properties": {
        "price": {"type": "number"},
        "name": {"type": "string"},
        "action": {"enum": ["resume", "down"]},
        "noname": {"type": "string", 'minLength': 1, 'maxLength': 100},
    },
    "pro": {
        'tag': {
            'type': 'array',
            'items': {
                "type": "string"
            }

        }
    },
    'required': ['noname'],  #必填項
}
validate(instance={"name": "Eggs", "price": 34.99}, schema=schema)  # pass,校驗數字
# validate(instance={"name": "Eggs", "price": 'd'}, schema=schema) # faild,校驗數字
validate(instance = { "tag" :[1,2,3]},schema = schema ) # pass,校驗列表
validate(instance={"action": 'resume'}, schema=schema)  # pass,校驗枚舉類型
# validate(instance={"action": 'd'}, schema=schema) #  faild,校驗

validate(instance={"action": 'resume','noname': 'zhangbiao'}, schema=schema)  # pass,校驗枚舉類型+字段長度
# validate(instance={"action": 'resume'}, schema=schema)  # faild,必填項校驗

 

結果是:

Failed validating 'type' in schema['properties']['price']:
{'type': 'number'}

On instance['price']:
'd'

校驗的參數為json串

schema = {"type": "object",
          "properties": {
              "resumejobid": {"type": "integer", "minimum": 0},
              "parameters": {
                  "type": "object",
                  "properties": {
                      "name": {"type": "string"},
                      "queue": {"type": "string"},
                      "workspace": {"type": "string"},
                  },
                  "required": ["name", "queue", "workspace"]
              },
          },
          "required": ["parameters", "resumejobid"]
          }

validate(instance={"parameters": {"name": "", "queue": "", "workspace": ""},
                   'resumejobid': 12}, schema=schema)  # pass

 

inputvalues = {'message': 'success', 'data': {'address': '成都', 'eid': 1, 'name': '錘子手機發布會', 'limit': 2000, 'start_time': '2017-11-21T15:25:19', 'status': True}, 'status': 200}

validate(inputvalues,schema=schema)

 

實際斷言時可以將jsonschema存在文件,然后取出來校驗。

r = requests.get(url)
schema=json.load(open("list_schema.json"))
validate(instance=r.json(), schema=schema)

Json schema 高級用法

1
2
https: / / www.cnblogs.com / terencezhou / p / 10474617.html
https: / / json - schema.org / understanding - json - schema / reference / combining.html?highlight = oneof

 

 

如何快速寫出Json Schema,校驗Json Schema

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM