欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JSONLINT:python的json數(shù)據(jù)驗證庫實例解析

 更新時間:2017年11月28日 17:24:55   作者:TANGWZ  
本文介紹的 jsonlint 啟發(fā)自 python 的表單驗證工具 wtforms,wtforms 通過繼承 Form 類也能進行 json 數(shù)據(jù)驗證,下面通過一些例子給大家詳細介紹,非常不錯,具有參考借鑒價值,需要的朋友參考下吧

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于人閱讀和編寫。

JSON 函數(shù)

使用 JSON 函數(shù)需要導入 json 庫:import json。

函數(shù) 描述
json.dumps 將 Python 對象編碼成 JSON 字符串
json.loads 將已編碼的 JSON 字符串解碼為 Python 對象

隨著前后端分離和 REST APIs 的火熱,開發(fā)者不斷尋找著一種靈活的、優(yōu)雅的方式驗證 json 數(shù)據(jù)。有直接手動獲取數(shù)據(jù)驗證的,也有使用 json scheme 驗證的。前者容易使得函數(shù)變得冗長,還可能存在不少重復的驗證;后者驗證又不靈活。

本文介紹的 jsonlint 啟發(fā)自 python 的表單驗證工具 wtforms,wtforms 通過繼承 Form 類也能進行 json 數(shù)據(jù)驗證,但是 wtforms 對于 json 的數(shù)組(Array)類型處理有著很詭異的行為,需要通過 a-1 、 a-2 這樣來傳遞數(shù)組數(shù)據(jù),常常不能有效的處理數(shù)組數(shù)據(jù)。 jsonlint 大部分代碼來著 wtforms,可以視為 wtforms 的一個分支。但 jsonlint 刪去了 wtforms 的表單渲染部分,更改了傳入的數(shù)據(jù)格式,最重要的是使用正確的邏輯驗證數(shù)組(Array)和對象(Object)類型。下面是一些例子:

基本的字符串類型json驗證

對于基本的字符串類型,我們只需要創(chuàng)建一個 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 數(shù)據(jù)

jsonlint 繼承了 wtforms 的優(yōu)點,可以進行一些更靈活的自定義json數(shù)據(jù)驗證,只要將 field 類的實例名寫成函數(shù) 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"]

對數(shù)組類型進行驗證

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

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 的數(shù)組,將對應類型的數(shù)組直接傳入,即可有效的驗證;ListField 同樣也可以進行自定義驗證。

對對象類型進行驗證

對象類型在一些 REST APIs 的 web 應用中也經(jīng)常存在,對此 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,這樣不但有著良好的驗證方式,還可以分割業(yè)務(wù),避免接口主函數(shù)變得十分冗長。例如,可以定義類:

class RegisterLint(UserLint):
 def validata_nickname(self, field):
  ...
 def validate_account(self, field):
  ...
 def create_user(self):
  ...
user = RegisterLint()

這樣既可以使用 RegisterLint 的實例 user 驗證數(shù)據(jù),同時又能直接執(zhí)行 user.create_user() 進行數(shù)據(jù)庫操作,將數(shù)據(jù)庫邏輯更好的封裝。這樣可以說是在 MVC 設(shè)計模式的基礎(chǔ)上獨立出了一層。

想要嘗試使用 jsonlint 可以直接使用 pip 安裝:

pip install jsonlint

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

jsonlint 現(xiàn)階段僅由我一人維護,雖然單元測試覆蓋率盡可能的全覆蓋,但也不代表沒有bug,希望您提出您寶貴的意見,或一起維護、迭代jsonlint:

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

如果使用 Flask 進行 web 開發(fā),也可以使用封裝好的結(jié)合了 Flask 和 jsonlint 的庫: Flask-Lint

相關(guān)文章

  • python實現(xiàn)selenium截圖的兩種方法

    python實現(xiàn)selenium截圖的兩種方法

    本文主要介紹了python實現(xiàn)selenium截圖的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Pythont特殊語法filter,map,reduce,apply使用方法

    Pythont特殊語法filter,map,reduce,apply使用方法

    這篇文章主要介紹了Pythont特殊語法filter,map,reduce,apply使用方法,需要的朋友可以參考下
    2016-02-02
  • 探索Python內(nèi)置數(shù)據(jù)類型的精髓與應用

    探索Python內(nèi)置數(shù)據(jù)類型的精髓與應用

    本文探索Python內(nèi)置數(shù)據(jù)類型的精髓與應用,包括字符串、列表、元組、字典和集合。通過深入了解它們的特性、操作和常見用法,讀者將能夠更好地利用這些數(shù)據(jù)類型解決實際問題。
    2023-09-09
  • Python pandas之求和運算和非空值個數(shù)統(tǒng)計

    Python pandas之求和運算和非空值個數(shù)統(tǒng)計

    數(shù)據(jù)處理的過程中經(jīng)常會遇到判斷空值和求和運算的需求,所以下面這篇文章主要給大家介紹了關(guān)于Python pandas之求和運算和非空值個數(shù)統(tǒng)計的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Python根據(jù)文件名批量轉(zhuǎn)移圖片的方法

    Python根據(jù)文件名批量轉(zhuǎn)移圖片的方法

    今天小編就為大家分享一篇Python根據(jù)文件名批量轉(zhuǎn)移圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python實現(xiàn)發(fā)送帶有pdf附件的電子郵件

    Python實現(xiàn)發(fā)送帶有pdf附件的電子郵件

    使用Python發(fā)郵件,是個簡單的話題,可是如何可以優(yōu)雅的輕松的群發(fā)郵件,并附加PDF附件,是很多小伙伴的日常工作。本文就來和大家分享一下實現(xiàn)方法,需要的可以參考一下
    2023-02-02
  • Python實現(xiàn)端口掃描器的示例代碼

    Python實現(xiàn)端口掃描器的示例代碼

    本文主要介紹了Python實現(xiàn)端口掃描器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Kotlin 中的 apply 函數(shù)用法詳解

    Kotlin 中的 apply 函數(shù)用法詳解

    apply 函數(shù)是 Kotlin 中一個十分方便的工具,它使得對對象進行初始化和配置變得更加簡潔、清晰,通過與 Java 的對比,我們可以看出 Kotlin 在處理類似情況時具有更高的表現(xiàn)力和簡潔性,本文給大家介紹Kotlin apply 函數(shù)的用法,感興趣的朋友一起看看吧
    2024-03-03
  • Python?NumPy教程之數(shù)組的基本操作詳解

    Python?NumPy教程之數(shù)組的基本操作詳解

    Numpy?中的數(shù)組是一個元素表(通常是數(shù)字),所有元素類型相同,由正整數(shù)元組索引。本文將通過一些示例詳細講一下NumPy中數(shù)組的一些基本操作,需要的可以參考一下
    2022-08-08
  • win10系統(tǒng)配置GPU版本Pytorch的詳細教程

    win10系統(tǒng)配置GPU版本Pytorch的詳細教程

    這篇文章主要介紹了win10系統(tǒng)配置GPU版本Pytorch,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論