资讯专栏INFORMATION COLUMN

jsonlint:python的json数据验证库

Cc_2011 / 3143人阅读

摘要:随着前后端分离和的火热,开发者不断寻找着一种灵活的优雅的方式验证数据。有直接手动获取数据验证的,也有使用验证的。但删去了的表单渲染部分,更改了传入的数据格式,最重要的是使用正确的逻辑验证数组和对象类型。

随着前后端分离和 REST APIs 的火热,开发者不断寻找着一种灵活的、优雅的方式验证 json 数据。有直接手动获取数据验证的,也有使用 json scheme 验证的。前者容易使得函数变得冗长,还可能存在不少重复的验证;后者验证又不灵活。

本文介绍的 jsonlint 启发自 python 的表单验证工具 wtforms,wtforms 通过继承 Form 类也能进行 json 数据验证,但是 wtforms 对于 json 的数组(Array)类型处理有着很诡异的行为,需要通过 a-1 、 a-2 这样来传递数组数据,常常不能有效的处理数组数据。 jsonlint 大部分代码来着 wtforms,可以视为 wtforms 的一个分支。但 jsonlint 删去了 wtforms 的表单渲染部分,更改了传入的数据格式,最重要的是使用正确的逻辑验证数组(Array)和对象(Object)类型。下面是一些例子:

基本的字符串类型json验证

对于基本的字符串类型,我们只需要创建一个 Json 的子类,填写对应的 Field 即可。使用方式和 wtforms 类型:

from jsonlint import Json
from jsonlint.fields import StringField
from jsonlint.validators import DataRequired

class MyLint(Json):
    name = StringField(validators=[DataRequired()])

mylint = MyLint({"name": "demo"})
print mylint.validate()  # True
print mylint.name.data  # demo
更灵活的验证 json 数据

jsonlint 继承了 wtforms 的优点,可以进行一些更灵活的自定义json数据验证,只要将 field 类的实例名写成函数 validate_fieldname ,即可自定义验证改字段:

from jsonlint import Json
from jsonlint.fields import IntegerField
from jsonlint.validators import ValidationError

class AgeLint(Json):
    age = IntegerField()

    def validate_age(form, field):
        if field.data < 13:
            raise ValidationError("We"re sorry, you must be 13 or older to register")

agelint = AgeLint({"age": 12})
print agelint.validate()  # False
print agelint.age.errors  # ["We"re sorry, you must be 13 or older to register"]
对数组类型进行验证

jsonlint 诞生可以说主要就是为了解决如何验证数组类型的问题,在jsonlint这很容易实现:

from jsonlint import Json
from jsonlint.fields import StringField, ListField
from jsonlint.validators import DataRequired, ValidationError

class ListLint(Json):
    cars = ListField(StringField(validators=[DataRequired()]))

    def validate_cars(form, field):
        if "BMW" in field.data:
            raise ValidationError("We"re sorry, you cannot drive BMW")

listlint = ListLint({"cars": ["Benz", "BMW", "Audi"]})
print listlint.validate()  # False
print listlint.cars.errors  # ["We"re sorry, you cannot drive BMW"]

ListField 类作为一个 Field 容器,容纳其它类型 Field 的数组,将对应类型的数组直接传入,即可有效的验证;ListField 同样也可以进行自定义验证。

对对象类型进行验证

对象类型在一些 REST APIs 的 web 应用中也经常存在,对此 jsonlint 也作了支持。只要将 Json 子类传入 ObjectField 中即可进行验证:

from jsonlint import Json
from jsonlint.fields import ObjectField, IntegerField, BooleanField

class T(Json):
    status = BooleanField()
    code = IntegerField()

class DataLint(Json):
    data = ObjectField(T)

datalint = DataLint({"data": {"status": True, "code": 200}})
print datalint.validate()  # False
print datalint.data.code.data  # 200
写在最后

jsonlint 诞生初衷就是因为本人想用类似 wtforms 的方式来验证json,这样不但有着良好的验证方式,还可以分割业务,避免接口主函数变得十分冗长。例如,可以定义类:

class RegisterLint(UserLint):
    def validata_nickname(self, field):
        ...

    def validate_account(self, field):
        ...

    def create_user(self):
        ...

user = RegisterLint()

这样既可以使用 RegisterLint 的实例 user 验证数据,同时又能直接执行 user.create_user() 进行数据库操作,将数据库逻辑更好的封装。这样可以说是在 MVC 设计模式的基础上独立出了一层。

想要尝试使用 jsonlint 可以直接使用 pip 安装:

pip install jsonlint

最后,jsonlint 开源在 Github : https://github.com/tangwz/jso...

jsonlint 现阶段仅由我一人维护,虽然单元测试覆盖率尽可能的全覆盖,但也不代表没有bug,希望您提出您宝贵的意见,或一起维护、迭代jsonlint:https://github.com/tangwz/jso...

如果使用 Flask 进行 web 开发,也可以使用封装好的结合了 Flask 和 jsonlint 的库: Flask-Lint

原文地址:http://tangwz.com/2017/11/28/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44522.html

相关文章

  • JSON数据格式及其在WEB开发中应用

    摘要:是什么是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,是原生格式,这意味着在中处理数据不需要任何特殊的或工具包。底层存储为格式是个构建在之上的新型查询语言。 JSON是什么? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式。同时,JSON是 Java...

    red_bricks 评论0 收藏0
  • 常用 composer 包推荐

    摘要:名称用途说明说明地址简单易用的请求库官网地址功能强大的请求库文档轻量级配置加载类支持多种配置格式简单的缓存类提供多种缓存驱动数字生成类似优酷视频支持多语言支持加盐生成官网地址网站地图生成器简单易用数据库操作类支持各种常见数据库文档生成 名称 用途说明 说明地址 mashape/unirest-php 简单易用的HTTP请求库 官网地址 guzzlehttp/guzzle ...

    Tamic 评论0 收藏0
  • PHP与AJAX相爱相杀

    摘要:响应一般由三个部分组成由一个数字和文字组成的状态码,用来显示请求是成功还是失败响应头,包含服务器类型,日期时间,内容类型和长度等响应体,也就是响应正文。获得形式的相应数据。和以数字和文本形式返回状态码。 学习目录: AJAX基础 PHP与AJAX JSON格式 jQuery中的AJAX 个人网站原创链接地址:不足之处欢迎留言...逃... showImg(https://segm...

    wthee 评论0 收藏0
  • PHP与AJAX相爱相杀

    摘要:响应一般由三个部分组成由一个数字和文字组成的状态码,用来显示请求是成功还是失败响应头,包含服务器类型,日期时间,内容类型和长度等响应体,也就是响应正文。获得形式的相应数据。和以数字和文本形式返回状态码。 学习目录: AJAX基础 PHP与AJAX JSON格式 jQuery中的AJAX 个人网站原创链接地址:不足之处欢迎留言...逃... showImg(https://segm...

    Clect 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<