JSONLINT:python 의 json 데이터 검증 라 이브 러 리 인 스 턴 스 분석

4944 단어 pythonjson
JSON(JavaScript Object Notation)은 가 벼 운 데이터 교환 형식 으로 쉽게 읽 고 작성 할 수 있 습 니 다.
JSON 함수
JSON 함 수 를 사용 하려 면 json 라 이브 러 리 를 가 져 와 야 합 니 다:import json.
함수.
묘사 하 다.
json.dumps
Python 대상 을 JSON 문자열 로 인 코딩
json.loads
인 코딩 된 JSON 문자열 을 Python 대상 으로 디 코딩 합 니 다.
앞 뒤 분리 와 REST API 가 뜨 거 워 지면 서 개발 자 들 은 제 이 슨 데 이 터 를 유연 하고 우아 하 게 검증 할 수 있 는 방법 을 찾 고 있다.직접 수 동 으로 데이터 검증 을 받 는 사람 도 있 고 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 류 의 인 스 턴 스 이름 을 함수 vaidate 로 쓰기 만 하면 됩 니 다.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 API 의 웹 응용 프로그램 에 도 자주 존재 하 는데 이에 대해 jsonlint 도 지원 했다.JSon 하위 클래스 를 Object Field 에 전송 하면 인증 할 수 있 습 니 다.

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 를 사용 하여 웹 개발 을 진행 하면 Flask 와 jsonlint 를 결합 한 라 이브 러 리 를 사용 할 수 있 습 니 다.Flask-Lint

좋은 웹페이지 즐겨찾기