最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JSONLINT:python的json數(shù)據(jù)驗(yàn)證庫(kù)實(shí)例解析

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

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

JSON 函數(shù)

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

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

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

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

基本的字符串類(lèi)型json驗(yàn)證

對(duì)于基本的字符串類(lèi)型,我們只需要?jiǎng)?chuàng)建一個(gè) Json 的子類(lèi),填寫(xiě)對(duì)應(yīng)的 Field 即可。使用方式和 wtforms 類(lèi)型:

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

更靈活的驗(yàn)證 json 數(shù)據(jù)

jsonlint 繼承了 wtforms 的優(yōu)點(diǎn),可以進(jìn)行一些更靈活的自定義json數(shù)據(jù)驗(yàn)證,只要將 field 類(lèi)的實(shí)例名寫(xiě)成函數(shù) validate_fieldname ,即可自定義驗(yàn)證改字段:

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"]

對(duì)數(shù)組類(lèi)型進(jìn)行驗(yàn)證

jsonlint 誕生可以說(shuō)主要就是為了解決如何驗(yàn)證數(shù)組類(lèi)型的問(wèn)題,在jsonlint這很容易實(shí)現(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 類(lèi)作為一個(gè) Field 容器,容納其它類(lèi)型 Field 的數(shù)組,將對(duì)應(yīng)類(lèi)型的數(shù)組直接傳入,即可有效的驗(yàn)證;ListField 同樣也可以進(jìn)行自定義驗(yàn)證。

對(duì)對(duì)象類(lèi)型進(jìn)行驗(yàn)證

對(duì)象類(lèi)型在一些 REST APIs 的 web 應(yīng)用中也經(jīng)常存在,對(duì)此 jsonlint 也作了支持。只要將 Json 子類(lèi)傳入 ObjectField 中即可進(jìn)行驗(yàn)證:

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

寫(xiě)在最后

jsonlint 誕生初衷就是因?yàn)楸救讼胗妙?lèi)似 wtforms 的方式來(lái)驗(yàn)證json,這樣不但有著良好的驗(yàn)證方式,還可以分割業(yè)務(wù),避免接口主函數(shù)變得十分冗長(zhǎng)。例如,可以定義類(lèi):

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

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

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

pip install jsonlint

最后,jsonlint 開(kāi)源在 Github : https://github.com/tangwz/jsonlint

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

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

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

相關(guān)文章

  • python實(shí)現(xiàn)批量解析郵件并下載附件

    python實(shí)現(xiàn)批量解析郵件并下載附件

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量解析郵件并下載附件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • python基于pexpect庫(kù)自動(dòng)獲取日志信息

    python基于pexpect庫(kù)自動(dòng)獲取日志信息

    這篇文章主要介紹了python基于pexpect庫(kù)自動(dòng)獲取日志信息的方法,幫助大家更好的利用python高效辦公,感興趣的朋友可以了解下
    2021-02-02
  • python利用線(xiàn)程生成不同尺寸的縮略圖實(shí)例詳解

    python利用線(xiàn)程生成不同尺寸的縮略圖實(shí)例詳解

    這篇文章主要介紹了python利用線(xiàn)程生成不同尺寸的縮略圖,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • numpy中的converters和usecols用法詳解

    numpy中的converters和usecols用法詳解

    本文主要介紹了numpy中的converters和usecols用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • python環(huán)境搭建和pycharm的安裝配置及漢化詳細(xì)教程(零基礎(chǔ)小白版)

    python環(huán)境搭建和pycharm的安裝配置及漢化詳細(xì)教程(零基礎(chǔ)小白版)

    這篇文章主要介紹了python環(huán)境搭建和pycharm的安裝配置及漢化(零基礎(chǔ)小白版),需要的朋友可以參考下
    2020-08-08
  • keras的backend 設(shè)置 tensorflow,theano操作

    keras的backend 設(shè)置 tensorflow,theano操作

    這篇文章主要介紹了keras的backend 設(shè)置 tensorflow,theano操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • 如何利用pycharm進(jìn)行代碼更新比較

    如何利用pycharm進(jìn)行代碼更新比較

    這篇文章主要介紹了如何利用pycharm進(jìn)行代碼更新比較,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 插入排序_Python與PHP的實(shí)現(xiàn)版(推薦)

    插入排序_Python與PHP的實(shí)現(xiàn)版(推薦)

    下面小編就為大家?guī)?lái)一篇插入排序_Python與PHP的實(shí)現(xiàn)版(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Python3從零開(kāi)始搭建一個(gè)語(yǔ)音對(duì)話(huà)機(jī)器人的實(shí)現(xiàn)

    Python3從零開(kāi)始搭建一個(gè)語(yǔ)音對(duì)話(huà)機(jī)器人的實(shí)現(xiàn)

    這篇文章主要介紹了Python3從零開(kāi)始搭建一個(gè)語(yǔ)音對(duì)話(huà)機(jī)器人的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python中的3種定義類(lèi)方法

    python中的3種定義類(lèi)方法

    這篇文章主要給大家分享得是 python中的3種定義類(lèi)方法,分別是普通方法、類(lèi)方法(@classmethod)以及類(lèi)方法(@classmethod),想了解方法具體實(shí)現(xiàn)的小伙伴可以參考下面文章內(nèi)容哦,希望對(duì)你有所幫助
    2021-11-11

最新評(píng)論

紫云| 青铜峡市| 怀远县| 旬邑县| 靖安县| 侯马市| 万全县| 金沙县| 达州市| 抚顺县| 卢氏县| 习水县| 昆山市| 安乡县| 大庆市| 德阳市| 湄潭县| 通榆县| 姚安县| 高安市| 扎鲁特旗| 山东省| 寿宁县| 西宁市| 内江市| 怀安县| 寿阳县| 德兴市| 中宁县| 巫溪县| 保定市| 兰坪| 彝良县| 安宁市| 大田县| 桂平市| 阳东县| 邵阳县| 白朗县| 鲜城| 祁东县|