工作中需要对如下json结构进行验证:

"ActiveStatus" : [
{
"effectiveDates" : {
"effectiveFrom" : "2018-05-10T12:44:17Z",
"effectiveTo" : "2018-05-11T00:29:29Z"
},
"status" : "Active",
"reason" : ""
},
{
"effectiveDates" : {
"effectiveFrom" : "2018-05-11T00:29:29Z"
},
"status" : "Inactive",
"reason" : "Expired/Matured"
}
],

使用cerberus, 定位到schema list.

(一)先从单条记录开始测试(cerberus_test_single.py)

from cerberus import Validator
from datetime import datetime, date, time def string_toDatetime(string):
return datetime.strptime(string, "%Y-%m-%d") schema={
'effectiveDates':{
'type':'dict',
'schema':{
'effectiveFrom':{'type':'datetime'},
'effectiveTo':{'type':'datetime'}
}
},
'status':{'type':'string','allowed':['Active','Inactive']},
'reason':{'type':'string'}
} document={
'effectiveDates':{
'effectiveFrom':string_toDatetime('2018-05-10'),
'effectiveTo':string_toDatetime('2018-05-11'),
},
'status':'Active',
'reason':'Expired'
} v=Validator(schema)
v.validate(document) print(v.errors)

在命令行运行文件,验证成功:

E:\Learning\AWS\cerberus>cerberus_test.py
{}

注:结果为{}表示v.errors中没有错误,即验证成功。

如果修改上述文件中的document为如下:

document={
'effectiveDates':{
'effectiveFrom':string_toDatetime('2018-05-10'),
'effectiveTo':string_toDatetime('2018-05-11'),
},
'status':'ctive',
'reason':'Expired'
}

此时将验证失败:

E:\Learning\AWS\cerberus>cerberus_test_single.py
{'status': ['unallowed value ctive']}

(二)加入list, 验证多条的情况:

首先想到将上述schema(红色部分)嵌套到一个schema里,然后type指定list:

schema={
'type':'list'
schema={
'effectiveDates':{
'type':'dict',
'schema':{
'effectiveFrom':{'type':'datetime'},
'effectiveTo':{'type':'datetime'}
}
},
'status':{'type':'string','allowed':['Active','Inactive']},
'reason':{'type':'string'}
}
}

代码如下(cerberus_test.py)

from cerberus import Validator
from datetime import datetime, date, time def string_toDatetime(string):
return datetime.strptime(string, '%Y-%m-%d') schema={
'activeStatus':{
'type':'list',
'schema':{
'effectiveDates':{
'type':'dict',
'schema':{
'effectiveFrom':{'type':'datetime'},
'effectiveTo':{'type':'datetime'}
}
},
'status':{'type':'string','allowed':['Active','Inactive']},
'reason':{'type':'string','allowed':['Expired','Matured']}
}
}
} document={
'activeStatus':[
{
'effectiveDates':{
'effectiveFrom':string_toDatetime('2018-05-10'),
'effectiveTo':string_toDatetime('2018-05-11')
},
'status':'Active',
'reason':'Expired'
},
{
'effectiveDates' : {
'effectiveFrom' :string_toDatetime('2018-05-11')
},
'status' : 'Inactive',
'reason' : 'Matured'
}
]
}
v=Validator(schema)
v.validate(document) print(v.errors)

命令行运行代码发现:

E:\Learning\AWS\cerberus>cerberus_test.py
Traceback (most recent call last):
File "E:\Learning\AWS\cerberus\test.py", line 48, in <module>
v.validate(document)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 877, in validate
self.__validate_definitions(definitions, field)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 940, in __validate_definitions
result = validate_rule(rule)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 922, in validate_rule
return validator(definitions.get(rule, None), field, value)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 1234, in _validate_schema
self.__validate_schema_sequence(field, schema, value)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 1259, in __validate_schema_sequence
update=self.update, normalize=False)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 877, in validate
self.__validate_definitions(definitions, field)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 940, in __validate_definitions
result = validate_rule(rule)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 921, in validate_rule
validator = self.__get_rule_handler('validate', rule)
File "C:\Python27\lib\site-packages\cerberus\validator.py", line 338, in __get_rule_handler
"domain.".format(rule, domain))
RuntimeError: There's no handler for 'status' in the 'validate' domain.

(三)解决办法:

仔细查看cerberus自带例子(http://docs.python-cerberus.org/en/stable/validation-rules.html#schema-list)

>>> schema = {'rows': {'type': 'list',
... 'schema': {'type': 'dict', 'schema': {'sku': {'type': 'string'},
... 'price': {'type': 'integer'}}}}}
>>> document = {'rows': [{'sku': 'KT123', 'price': 100}]}
>>> v.validate(document, schema)
True

发现它把schema又嵌入到一个shema里,而不是我想的那样,于是我这么做:

schema={
'activeStatus':{
'type':'list',
'schema':{
'schema':{
'effectiveDates':{
'type':'dict',
'schema':{
'effectiveFrom':{'type':'datetime'},
'effectiveTo':{'type':'datetime'}
}
},
'status':{'type':'string','allowed':['Active','Inactive']},
'reason':{'type':'string','allowed':['Expired','Matured']}
}
}
}
}

竟然可以成功验证!以下为完整的python文件(cerberus_test.py):

from cerberus import Validator
from datetime import datetime, date, time
#import pdb def string_toDatetime(string):
return datetime.strptime(string, '%Y-%m-%d') schema={
'activeStatus':{
'type':'list',
'schema':{
'schema':{
'effectiveDates':{
'type':'dict',
'schema':{
'effectiveFrom':{'type':'datetime'},
'effectiveTo':{'type':'datetime'}
}
},
'status':{'type':'string','allowed':['Active','Inactive']},
'reason':{'type':'string','allowed':['Expired','Matured']}
}
}
}
} document={
'activeStatus':[
{
'effectiveDates':{
'effectiveFrom':string_toDatetime('2018-05-10'),
'effectiveTo':string_toDatetime('2018-05-11')
},
'status':'Active',
'reason':'Expired'
},
{
'effectiveDates' : {
'effectiveFrom' :string_toDatetime('2018-05-11')
},
'status' : 'Inactive',
'reason' : 'Matured'
}
]
} #pdb.set_trace()
v=Validator(schema)
v.validate(document) print(v.errors)

注意:因为schema是list,document在构建的时候需要使用数组[]。

schema list validator --python cerberus的更多相关文章

  1. Json schema 以及在python中的jsonschema

    目录 1. JSON Schema简介 2. JSON Schema关键字详解 2.1 $schema 2.2 title和description 2.3 type 3 type常见取值 3.1 当t ...

  2. Awesome Python

    Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Insp ...

  3. Python资源汇总

    Python 目录: 管理面板 算法和设计模式 反垃圾邮件 资产管理 音频 验证 构建工具 缓存 ChatOps工具 CMS 代码分析和Linter 命令行工具 兼容性 计算机视觉 并发和并行性 组态 ...

  4. Python库资源大全

    转载地址:https://zhuanlan.zhihu.com/p/27350980 本文是一个精心设计的Python框架.库.软件和资源列表,是一个Awesome XXX系列的资源整理,由BigQu ...

  5. Life is short.,You need Python

    真棒Python  https://awesome-python.com/ 精选的Python框架,库,软件和资源的精选列表. 灵感来自awesome-php. 真棒Python 管理员面板 算法和设 ...

  6. python RESTful API框架:Eve 高速入门

    Eve是一款Python的REST API框架.用于公布高可定制的.全功能的RESTful的Web服务.帮你轻松创建和部署API,本文翻译自Eve官方站点: http://python-eve.org ...

  7. Python库资源大全【收藏】

    本文是一个精心设计的Python框架.库.软件和资源列表,是一个Awesome XXX系列的资源整理,由BigQuant整理加工而成,欢迎扩散.欢迎补充! 对机器学习.深度学习在量化投资中应用感兴趣的 ...

  8. Java使用Schema模式对XML验证

    XML允许创作者定义自己的标签,因其灵活的特性让其难以编写和解析.因此必须使用某种模式来约束其结构.目前最流行的这种模式有两种:DTD和SCHEMA,而后者以其独特的优势即将取代DTD模式,目前只是过 ...

  9. [SoapUI]怎样运用Schema通过*.xsd文件来验证response对应的xml文件

    添加Groovy Script脚本对Test Step进行验证 脚本如下(已经运行通过): import javax.xml.XMLConstants import javax.xml.transfo ...

随机推荐

  1. char和achar互转

    #pragma once#include "stdafx.h" #ifndef _Convert_H_#define _Convert_H_ //定义转换类class Conver ...

  2. MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数

    MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数 计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数,这里主要分享的是通过MySql内置的函数 TimeStampDiff() ...

  3. 2018-12-25-C#-使用转换语义版本号

    title author date CreateTime categories C# 使用转换语义版本号 lindexi 2018-12-25 09:25:41 +0800 2018-06-29 12 ...

  4. jmeter日期处理beanshell(2)

    import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.text.P ...

  5. day5_python之环境变量设置

    1.设置环境变量 import os,sys print(os.path.abspath(__file__)) #当前py文件的绝对路径 print(os.path.dirname(os.path.a ...

  6. css设置Overflow实现隐藏滚动条的同时又可以滚动

    .scroll-list ul{ white-space: nowrap; -webkit-overflow-scrolling: touch; overflow-x: auto; overflow- ...

  7. 递归求gcd(a,b)

    int gcd(int a,int b) { ) return a; else return gcd(b,a%b); }

  8. Navicat for MySQL 使用SSH方式链接远程数据库

    第一步:ssh部分: 端口号:22 用户名为:在xshell中用来登录服务器的账号密码 第二步: 端口:3306 账号密码:在MySQL中的登录账号密码

  9. Python--day40--复习和回调函数实例

  10. 配置gitignore后使其生效命令

    改动过.gitignore文件之后,在repo的根目录下运行: git rm -r --cached . git add . 之后可以进行提交: git commit -m "fixed u ...