国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

JSONLINT:python的json數據驗證庫實例解析

2020-01-04 16:14:33
字體:
來源:轉載
供稿:網友

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 Jsonfrom jsonlint.fields import StringFieldfrom jsonlint.validators import DataRequiredclass MyLint(Json): name = StringField(validators=[DataRequired()])mylint = MyLint({'name': 'demo'})print mylint.validate() # Trueprint mylint.name.data # demo

更靈活的驗證 json 數據

jsonlint 繼承了 wtforms 的優點,可以進行一些更靈活的自定義json數據驗證,只要將 field 類的實例名寫成函數 validate_fieldname ,即可自定義驗證改字段:

from jsonlint import Jsonfrom jsonlint.fields import IntegerFieldfrom jsonlint.validators import ValidationErrorclass 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() # Falseprint agelint.age.errors # ["We're sorry, you must be 13 or older to register"]

對數組類型進行驗證

jsonlint 誕生可以說主要就是為了解決如何驗證數組類型的問題,在jsonlint這很容易實現:

from jsonlint import Jsonfrom jsonlint.fields import StringField, ListFieldfrom jsonlint.validators import DataRequired, ValidationErrorclass 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() # Falseprint listlint.cars.errors # ["We're sorry, you cannot drive BMW"]

ListField 類作為一個 Field 容器,容納其它類型 Field 的數組,將對應類型的數組直接傳入,即可有效的驗證;ListField 同樣也可以進行自定義驗證。

對對象類型進行驗證

對象類型在一些 REST APIs 的 web 應用中也經常存在,對此 jsonlint 也作了支持。只要將 Json 子類傳入 ObjectField 中即可進行驗證:

from jsonlint import Jsonfrom jsonlint.fields import ObjectField, IntegerField, BooleanFieldclass T(Json): status = BooleanField() code = IntegerField()class DataLint(Json): data = ObjectField(T)datalint = DataLint({'data': {'status': True, 'code': 200}})print datalint.validate() # Falseprint 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 逊克县| 延寿县| 澎湖县| 仁怀市| 金乡县| 余干县| 乌什县| 丹东市| 壤塘县| 蓬安县| 镇沅| 卓尼县| 锦屏县| 镇远县| 五莲县| 工布江达县| 交城县| 汝城县| 绍兴县| 自治县| 仙桃市| 宝清县| 淮南市| 宣武区| 祁阳县| 中方县| 鸡东县| 逊克县| 都江堰市| 稷山县| 吴忠市| 封开县| 长兴县| 汨罗市| 旌德县| 石棉县| 中宁县| 宣武区| 平利县| 永嘉县| 林口县|