工作中需要对如下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. String字符串的比较 Day15

    package com.sxt.review; /* * String字符串的比较 * ==和equals() * 总结:比较String内容时用equals()方法 */ public class ...

  2. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  3. hdu 1003 hdu 1231 最大连续子序列【dp】

    HDU1003 HDU1231 题意自明.可能是真的进步了点,记得刚开始研究这个问题时还想了好长时间,hdu 1231还手推了很长时间,今天重新写干净利落就AC了. #include<iostr ...

  4. myeclipse 如何更改java jsp 等文件的编码方式

    java的编码方式: 1.window——>preference 2.General——>Workspace,右边[Text file encoding]选择编码后,点击[OK]. jsp ...

  5. Data Flow-File Read-基本过程

  6. oracle函数 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注:值1……n 不能为条件表达式,这种情况只能用case when then end解 ...

  7. H3C 路由器的特点

  8. [C#] Parallel.For的线程数

    Parallel.For会自动判断同时运行多少个线程,但你也可以进行干预. ParallelOptions可以设置Parallel.For最大的并发线程.缺省的最大线程数是CPU核数.这通常是不够多的 ...

  9. HDU 2191多重背包问题、

    #include<cstdio> #include<cmath> #include<iostream> #include<cstring> +; int ...

  10. cp拷贝

    1 cp 拷贝.复制 NAME cp - copy files and directories SYNOPSIS cp [OPTION]... [-T] SOURCE DEST        -- c ...