schema list validator --python cerberus
工作中需要对如下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的更多相关文章
- 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 ...
- Awesome Python
Awesome Python A curated list of awesome Python frameworks, libraries, software and resources. Insp ...
- Python资源汇总
Python 目录: 管理面板 算法和设计模式 反垃圾邮件 资产管理 音频 验证 构建工具 缓存 ChatOps工具 CMS 代码分析和Linter 命令行工具 兼容性 计算机视觉 并发和并行性 组态 ...
- Python库资源大全
转载地址:https://zhuanlan.zhihu.com/p/27350980 本文是一个精心设计的Python框架.库.软件和资源列表,是一个Awesome XXX系列的资源整理,由BigQu ...
- Life is short.,You need Python
真棒Python https://awesome-python.com/ 精选的Python框架,库,软件和资源的精选列表. 灵感来自awesome-php. 真棒Python 管理员面板 算法和设 ...
- python RESTful API框架:Eve 高速入门
Eve是一款Python的REST API框架.用于公布高可定制的.全功能的RESTful的Web服务.帮你轻松创建和部署API,本文翻译自Eve官方站点: http://python-eve.org ...
- Python库资源大全【收藏】
本文是一个精心设计的Python框架.库.软件和资源列表,是一个Awesome XXX系列的资源整理,由BigQuant整理加工而成,欢迎扩散.欢迎补充! 对机器学习.深度学习在量化投资中应用感兴趣的 ...
- Java使用Schema模式对XML验证
XML允许创作者定义自己的标签,因其灵活的特性让其难以编写和解析.因此必须使用某种模式来约束其结构.目前最流行的这种模式有两种:DTD和SCHEMA,而后者以其独特的优势即将取代DTD模式,目前只是过 ...
- [SoapUI]怎样运用Schema通过*.xsd文件来验证response对应的xml文件
添加Groovy Script脚本对Test Step进行验证 脚本如下(已经运行通过): import javax.xml.XMLConstants import javax.xml.transfo ...
随机推荐
- 在WPF中使用谷歌地图和高德地图
原文:在WPF中使用谷歌地图和高德地图 在桌面软件开发中可能会遇到这样的需求:显示地图. 常用的地图API有Google Map和高德地图.二者都提供了各种平台的API. 为了方便集成,本文使用Jav ...
- 为什么不喜欢在 QQ 群里回答问题?
为什么不喜欢在 QQ 群里回答问题? 没有主题,主题随时都在变. 回答后无法备份,当然自己有心可以总结一下. 实时性要求太强,可能回答但是突然有事离开,再回头看已经是 几十条的留言. QQ 群用来闲聊 ...
- 06多次查询某区间内topk问题
题目描述:给定一个数组,需要多次查找不同区间内的,第k大或者第k小的元素. 考虑题目是多次查找,如果采用只对查询区间内的元素进行排序的思路,然后输出第k大的数的策略,那 ...
- Jupyter Magic - Timing(%%time %time %timeit)
对于计时有两个十分有用的魔法命令:%%time 和 %timeit. 如果你有些代码运行地十分缓慢,而你想确定是否问题出在这里,这两个命令将会非常方便. 1.%%time 将会给出cell的代码运行一 ...
- 使用openssl 工具进行双向认证测试
1,双向认证测试(需要根证书,客户证书,服务器证书以及各自的私钥)(验证通信双方的身份) openssl s_server -accept -key certs/server.key -cert ce ...
- ITA 15.5 Optimal binary search trees
p400 页最后一段 When j >= i , we need to select a root kr from among ki ... kj and then make an optima ...
- Element-ui学习笔记3--Form表单(三)
InputNumber <el-input-number v-model="num" @change="handleChange" :min=" ...
- NLP进阶之(七)膨胀卷积神经网络
NLP进阶之(七)膨胀卷积神经网络1. Dilated Convolutions 膨胀卷积神经网络1.2 动态理解1.2.2 转置卷积动画1.2.3 理解2. Dilated Convolutions ...
- 理解java面向对象基础
1. 类和对象 一切皆对象,这可以说是面向对象的核心思想了. 类,就是具有相同性质对象的抽象. 而类的每一个具体的实例就是一个对象. 我们可以定义一个Person类,这个Person类就是所有的人的抽 ...
- Python--day25--接口类多继承