[Python] Validierung von JSON mit Voluptuous

So führen Sie eine Validierung von JSON-Werten mithilfe der Voluptuous-Bibliothek in Python durch.

Was ist üppig?

Validierungsbibliothek wie JSON von Python.

Offizielles Repository: https://github.com/alecthomas/voluptuous

Voluptuous, despite the name, is a Python data validation library. It is primarily intended for validating data coming into Python as JSON, YAML, etc.

Wie in der Beschreibung im Repository erwähnt, ist es ein großartiger Name.

voluptuous


1 Gönnen Sie sich Lust, ertrinken Sie in Alkohol, sinnlich.
2 Sinnlich, sexy, bezaubernd, sexy.
3 <Gefühl usw.> Bequem.

install

Python 2.6 und höher

Kann mit pip installiert werden.

# pip install voluptuous

Python 2.5 Obwohl es nicht offiziell unterstützt wird, kann es auf dieser Artikelebene mit Install Voluptuous with Python 2.5 installiert und betrieben werden.

Sample program Ein Beispielprogramm, das die Operation zeigt. Wo sich die Schema-Deklaration in get_schema im Kern befindet. Dies ist die Definition des JSON-Schemas in Voluptuous.

from __future__ import with_statement
import re
import sys
import json  # Python 2.5 ist simplejson
import six
from voluptuous import Schema, Required, Any, Range, Invalid, ALLOW_EXTRA


def validate_io_size(v):
	if re.search("^[0-9]+[bkm]", v) is None:
		raise Invalid("not a valid value (%s)" % str(v))


def get_schema():
	schema = Schema({
		"comment"					: six.text_type,
		Required("operation")		: Any("read", "write"),
		"thread"					: Range(min=1),
		Required("io_size")			: validate_io_size,
		Required("access_percentage")	: Range(min=1, max=100),
	}, extra=ALLOW_EXTRA)
	
	return schema


def main():
	schema	= get_schema()
	
	with open(sys.argv[1], "r") as fp:
		dict_sample	= json.load(fp)
	
	schema(dict_sample)
	six.print_(dict_sample)
	
	return 0


if __name__ == '__main__':
	sys.exit(main())

Einzelheiten

Üppiger Begriff

Schlüsselwörter Bedeutung
Erforderlich Erforderliche Parameter. Es tritt kein Fehler auf, auch wenn die Parameter ohne diesen weggelassen werden.
Beliebig Beliebiger Wert in der Deklaration ist OK.
Bereich min oder mehr und max oder weniger ist OK. Sie können auch nur min oder max angeben.
ALLOW_EXTRA Ermöglicht das Vorhandensein von Parametern, die nicht im Schema definiert sind.

Validierungsmethode

Einer der folgenden

  1. Direkte Angabe möglicher Werte. Es ist auch möglich, eine Breite mit Beliebig, Bereich usw. zu haben.
  2. Klasse (Int, float usw., six.text_type kann angegeben werden)
  1. Geben Sie die Validierungsfunktion an

Betriebsbeispiel

Umgebung

Beispiel für normalen Betrieb

valid1.json


{
	"comment"			: "comment",
	"operation"			: "write",
	"thread"			: 8,
	"io_size"			: "8k",
	"access_percentage"	: 100
}
# python voluptuous_sample.py valid1.json
{u'comment': u'comment', u'operation': u'write', u'access_percentage': 100, u'thread': 8, u'io_size': u'8k'}
#

Beispiel für normalen Betrieb (erforderliche Parameter weggelassen)

valid2.json


{
	"operation"			: "write",
	"io_size"			: "8k",
	"access_percentage"	: 100
}
# python voluptuous_sample.py valid2.json
{u'operation': u'write', u'access_percentage': 100, u'io_size': u'8k'}

Es tritt kein Fehler auf, auch wenn keine erforderlichen Parameter vorhanden sind.

Beispiel für eine Fehleroperation

invalid.json


{
	"comment"			: "comment",
	"operation"			: "<invalid value>",
	"thread"			: 8,
	"io_size"			: "8k",
	"access_percentage"	: 100
}
# python voluptuous_sample.py invalid.json
Traceback (most recent call last):
  File "voluptuous_sample.py", line 36, in <module>
    sys.exit(main())
  File "voluptuous_sample.py", line 29, in main
    schema(dict_sample)
  File "/usr/local/lib/python2.7/dist-packages/voluptuous.py", line 337, in __call__
    return self._compiled([], data)
  File "/usr/local/lib/python2.7/dist-packages/voluptuous.py", line 635, in validate_dict
    return base_validate(path, iteritems(data), out)
  File "/usr/local/lib/python2.7/dist-packages/voluptuous.py", line 471, in validate_mapping
    raise MultipleInvalid(errors)
voluptuous.MultipleInvalid: not a valid value for dictionary value @ data[u'operation']
#

Wenn es einen Parameter gibt, der nicht mit dem Schema übereinstimmt, wird voluptuous.MultipleInvalid gesendet und Ich erhalte die Meldung, dass der Wert des Parameters (Operation im Beispiel) falsch ist.

Beispiel für eine Fehleroperation (wenn die Validierungsfunktion angegeben ist)

invalid2.json


{
	"comment"			: "comment",
	"operation"			: "write",
	"thread"			: 8,
	"io_size"			: "a8k",
	"access_percentage"	: 100
}
# python voluptuous_sample.py invalid2.json
Traceback (most recent call last):
  File "voluptuous_sample.py", line 38, in <module>
    sys.exit(main())
  File "voluptuous_sample.py", line 31, in main
    schema(dict_sample)
  File "/usr/local/lib/python2.7/dist-packages/voluptuous.py", line 337, in __call__
    return self._compiled([], data)
  File "/usr/local/lib/python2.7/dist-packages/voluptuous.py", line 635, in validate_dict
    return base_validate(path, iteritems(data), out)
  File "/usr/local/lib/python2.7/dist-packages/voluptuous.py", line 471, in validate_mapping
    raise MultipleInvalid(errors)
voluptuous.MultipleInvalid: not a valid value (a8k) for dictionary value @ data[u'io_size']

Dies ist auch der Fall, wenn die Validierungsfunktion angegeben ist.

Recommended Posts

[Python] Validierung von JSON mit Voluptuous
Python #JSON
Überprüfen Sie JSON-Objekte mit Python DictShield
Starten Sie Python
Scraping mit Python
Bearbeiten Sie Redmine mit Python Redmine
[Python] Verwenden Sie JSON mit Python
Fibonacci-Sequenz mit Python
Umgang mit Json in Python
Datenbereinigung mit Python
Verwenden von Python # externen Paketen
Installieren Sie Voluptuous mit Python 2.5
WiringPi-SPI-Kommunikation mit Python
Altersberechnung mit Python
Suchen Sie Twitter mit Python
Namensidentifikation mit Python
Hinweise zur Verwendung von Python-Unterprozessen
Versuchen Sie es mit Tweepy [Python2.7]
Python-Memo mit perl-ternärem Operator
Mit Python abflachen
Speichern Sie Bilder mit Python3-Anforderungen
[S3] CRUD mit S3 unter Verwendung von Python [Python]
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
POST json mit Python 3-Skript
Verwenden von Quaternion mit Python ~ numpy-quaternion ~
Versuchen Sie es mit Kubernetes Client -Python-
Python-Notizen zur Verwendung von Perl-Spezialvariablen
Scraping mit Python 3.5 Async-Syntax
Überwachung von Website-Änderungen mit Python
Mit Python auf Twitter posten
Suchalgorithmus mit word2vec [Python]
Ändern Sie die Python-Version mit pyenv
Python: Grundlagen der Verwendung von Scikit-Learn ①
# 1 [python3] Einfache Berechnung mit Variablen
Deaktivieren Sie die SSL-Validierung, ohne in Python-Anforderungen verify = False zu verwenden
Erstellen Sie JIRA-Tickets mit Python
Instrumentensteuerung mit Python [pyvisa]
Bearbeiten Sie Tabellenkalkulationen lokal mit Python
Python-Memo mit Perl --join
Python: Jwa / Jwe ECDH-ES-Validierung
Web Scraping mit Selenium (Python)
Online-Übertragung mit Python
Formatieren Sie json mit Vim (mit Python)
Datenanalyse mit Python-Pandas
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Verwenden von OpenCV mit Python @Mac
[Python] Schießspiel mit Pyxel
Senden Sie mit Python mit Google Mail
Lesen von JSON-Daten mit Python
Vervollständigung von Python mit Emacs mit Company-Jedi
So installieren Sie Python mit Anaconda
Harmonischer Mittelwert von Python (mit SciPy)
[Python] Laden von CSV-Dateien mit Pandas
GUI-Programmierung in Python mit Appjar
Python Hinweis: Über den Vergleich mit is
[Ubuntu] [Python] Objektverfolgung mit dlib
Bilderfassung von Firefox mit Python