本文尝试通过json数据校验方法解决如下几个问题:
数据没有校验,系统处于裸奔状态,导致后期维护成本高;
编写一堆校验代码,混杂在业务代码中,导致代码可读性降低;
API交付的时候提供一大段接口描述文档,但用户还是要揣测文档意思。
1. 背景介绍
1.1 无处不在的JSON
JSON是一种轻量级的数据交换格式,基于Javascript的一个子集, 但采用完全独立于语言的文本格式,易于人阅读和编写,同时也易于机器解析和生成。这些特性使JSON成为理想的数据交换语言, 几乎所有与网页开发相关的语言都有JSON库。目前蓝鲸ESB,甚至公司内绝大多数系统的交互都采用JSON格式。
1.2 令人头疼的数据校验
由于JSON比较灵活,没有固定的schema,使用JSON作为数据交换格式时,我们经常遇到数据校验的问题。一个简单的JSON数据往往需要写一大段代码来校验数据格式是否符合预期,导致代码膨胀,可读性不好。
如下是一段CC系统新增自定义变量的请求参数,大致分成几部分请求账户、操作者、添加到的目标业务和环境类型,最后是要添加的变量列表。
{
"systemId": "", # 系统账号
"password": "", # 系统密码
"operator": "hoffer", # 操作者
"ticket": "", # 操作者的ticket信息
"ApplicationID": 295, # 业务ID
"EnviType": 1, # 环境类型
"Params": [{
"Scope": "[0-1000].gameserver.*.*", # 变量作用域
"KeyName": "domain", # 变量名称
"ValName": "awx.zhunter.com" # 变量值
},
{
"Scope": "[1001-2000].gameserver.*.*", # 变量作用域
"KeyName": "domain", # 变量名称
"ValName": "awx.zhunter.com" # 变量值
}]
}
为了校验参数的正确性,往往的做法是写如下一段代码(用kwargs表示请求参数)
# 参数数据类型校验
if not isinstance(kwargs, dict):
return False, "kwargs must be dict"
# 校验systemId是否在参数字段中
if "systemId" not in kwargs:
return False, "systemId is required"
# 校验systemId值的类型
if not instance(kwargs["systemId"], basestring):
return False, "systemId must be string"
# 校验systemId值是否为空
if not kwargs["systemId"]: