JSONLINT:python的json数据验证库实例解析

 更新时间:2017年11月28日 17:24:55   作者:TANGWZ  
本文介绍的 jsonlint 启发自 python 的表单验证工具 wtforms,wtforms 通过继承 Form 类也能进行 json 数据验证,下面通过一些例子给大家详细介绍,非常不错,具有参考借鉴价值,需要的朋友参考下吧

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。

JSON 函数

使用 JSON 函数需要导入 json 库:import json。

函数 描述
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象

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

相关文章

  • python中遍历文件的3个方法

    python中遍历文件的3个方法

    这篇文章主要介绍了python中遍历文件的3个方法,本文分别使用os.path.walk()、os.walk()、os.listdir()来实现,需要的朋友可以参考下
    2014-09-09
  • 删除pycharm鼠标右键快捷键打开项目的操作

    删除pycharm鼠标右键快捷键打开项目的操作

    这篇文章主要介绍了删除pycharm鼠标右键快捷键打开项目的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • python使用QQ邮箱实现自动发送邮件

    python使用QQ邮箱实现自动发送邮件

    这篇文章主要为大家详细介绍了python使用QQ邮箱实现自动发送邮件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 教你如何在Pygame 中移动你的游戏角色

    教你如何在Pygame 中移动你的游戏角色

    Pygame是一组跨平台的 Python 模块,专为编写视频游戏而设计,您可以使用 pygame 创建不同类型的游戏,包括街机游戏、平台游戏等等,今天通过本文给大家介绍Pygame移动游戏角色的实现过程,一起看看吧
    2021-09-09
  • python用glob模块匹配路径的方法详解

    python用glob模块匹配路径的方法详解

    这篇文章主要介绍了python如何用glob模块匹配路径,glob模块是Python的一个标准库,用于在文件系统中查找文件名匹配特定模式的文件路径,需要的朋友可以参考下
    2024-02-02
  • python九九乘法表的实例

    python九九乘法表的实例

    下面小编就为大家带来一篇python九九乘法表的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Pytorch根据layers的name冻结训练方式

    Pytorch根据layers的name冻结训练方式

    今天小编就为大家分享一篇Pytorch根据layers的name冻结训练方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python实现GUI计算器(附源码)

    Python实现GUI计算器(附源码)

    这篇文章主要为大家详细介绍了如何利用Python语言实现GUI计算器,可执行复杂运算,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-11-11
  • Python+numpy实现矩阵的行列扩展方式

    Python+numpy实现矩阵的行列扩展方式

    今天小编就为大家分享一篇Python+numpy实现矩阵的行列扩展方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python3.4下django集成使用xadmin后台的方法

    python3.4下django集成使用xadmin后台的方法

    本篇文章主要介绍了python3.4下django集成使用xadmin后台的方法,具有一定的参加价值,有兴趣的可以了解一下
    2017-08-08

最新评论