JSON

jsonlint:python的json数据验证库

字号+ 作者:H5之家 来源:H5之家 2017-12-06 09:00 我要评论( )

随着前后端分离和 REST APIs 的火热,开发者不断寻找着一种灵活的、优雅的方式验证 json 数据。有直接手动获取数据验证的,也有使用 json scheme 验证的。前者容

> 脚本语言 > python >

jsonlint:python的json数据验证库 2017-11-30 16:13 出处:清屏网 人气: 

随着前后端分离和 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/jsonlint

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

https://github.com/tangwz/jsonlint/issues

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

分享给小伙伴们:

本文标签: jsonlint,python,json/">jsonlint,python,json

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

  • 本类最热新闻

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • PHP如何处理JAVA过来的接口和PHP返回给Javascript的JSON字符串

      PHP如何处理JAVA过来的接口和PHP返回给Javascript的JSON字符串

      2017-12-05 10:12

    • 初学python,哪个教程比较好,网络的或者是书 都行

      初学python,哪个教程比较好,网络的或者是书 都行

      2017-12-04 13:00

    • 千锋教育视频教程

      千锋教育视频教程

      2017-12-04 10:00

    • JSON 與XML比較

      JSON 與XML比較

      2017-12-04 09:03

    网友点评