国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - JSONLINT:python的json數(shù)據(jù)驗(yàn)證庫實(shí)例解析

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

2020-12-21 00:08TANGWZ Python

本文介紹的 jsonlint 啟發(fā)自 python 的表單驗(yàn)證工具 wtforms,wtforms 通過繼承 Form 類也能進(jìn)行 json 數(shù)據(jù)驗(yàn)證,下面通過一些例子給大家詳細(xì)介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧

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

JSON 函數(shù)

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

 

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

 

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

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

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

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

?
1
2
3
4
5
6
7
8
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 類的實(shí)例名寫成函數(shù) validate_fieldname ,即可自定義驗(yàn)證改字段:

?
1
2
3
4
5
6
7
8
9
10
11
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ù)組類型進(jìn)行驗(yàn)證

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

?
1
2
3
4
5
6
7
8
9
10
11
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 類作為一個(gè) Field 容器,容納其它類型 Field 的數(shù)組,將對(duì)應(yīng)類型的數(shù)組直接傳入,即可有效的驗(yàn)證;ListField 同樣也可以進(jìn)行自定義驗(yàn)證。

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

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

?
1
2
3
4
5
6
7
8
9
10
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 誕生初衷就是因?yàn)楸救讼胗妙愃?wtforms 的方式來驗(yàn)證json,這樣不但有著良好的驗(yàn)證方式,還可以分割業(yè)務(wù),避免接口主函數(shù)變得十分冗長。例如,可以定義類:

?
1
2
3
4
5
6
7
8
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ù)庫操作,將數(shù)據(jù)庫邏輯更好的封裝。這樣可以說是在 MVC 設(shè)計(jì)模式的基礎(chǔ)上獨(dú)立出了一層。

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

?
1
pip install jsonlint

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

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

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

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

原文鏈接:http://tangwz.com/2017/11/28/jsonlint/?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 人人草天天草 | 国产亚洲一区二区三区 | 亚洲精品免费在线视频 | 亚洲欧美第一页 | 国产一级毛片aaa | 亚洲aaa| 日韩欧美一区二区三区免费观看 | 日韩视频精品在线 | 亚洲精品国产乱码在线看蜜月 | 黄色影片免费观看 | 中文字幕一区二区三区乱码在线 | 一级免费av| 欧美专区在线观看 | 国产日韩欧美精品 | 午夜影院 | 国内精品久久久久久久影视红豆 | 国产区视频| 亚洲欧洲日韩 | 91精品一区二区 | 午夜精品久久久久久久久 | 91久久精品一二三 | 在线a视频 | 色视频在线免费看 | 久在线视频 | 精品久久av | 91视频网页版 | 成人中文字幕在线观看 | 欧美一区二区最爽乱淫视频免费看 | 国产成人精品久久二区二区 | 国产片性视频免费播放 | 可以在线观看的av网站 | 中文字幕日韩一区 | www.色午夜.com | 呦呦在线观看 | 在线无码| 精产品自偷自拍 | 久久99视频 | 亚洲精品国产setv | 欧美国产精品一区二区三区 | 中文字幕精品一区二区三区精品 | 久久久久a |