So führen Sie eine Validierung von JSON-Werten mithilfe der Voluptuous-Bibliothek in Python durch.
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
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())
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. |
Einer der folgenden
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'}
#
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.
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.
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