Comment effectuer la validation des valeurs JSON à l'aide de la bibliothèque Voluptuous en Python.
Bibliothèque de validation telle que JSON de Python.
Dépôt officiel: 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.
Comme mentionné dans la description du référentiel, c'est un super nom.
voluptuous
1 Se livrer à la luxure, se noyer dans l'alcool, sensuel.
2 sensuel, sexy, adorable, sexy.
3 <Sentiment, etc.> Confortable.
install
Peut être installé avec pip.
# pip install voluptuous
Python 2.5 Bien qu'il ne soit pas officiellement pris en charge, il peut être installé et utilisé à ce niveau d'article avec Installer Voluptuous avec Python 2.5.
Sample program Un exemple de programme qui montre l'opération. Où la déclaration de schéma dans get_schema est au cœur. C'est la définition du schéma JSON dans Voluptuous.
from __future__ import with_statement
import re
import sys
import json # Python 2.5 est 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())
Mots-clés | signification |
---|---|
Obligatoire | Paramètres obligatoires. Aucune erreur ne se produira même si les paramètres sans cela sont omis. |
Any | Toute valeur dans la déclaration est OK. |
Plage | min ou plus et max ou moins est OK. Vous pouvez également spécifier uniquement min ou max. |
ALLOW_EXTRA | Autorise l'existence de paramètres non définis dans le schéma. |
L'un des suivants
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'}
Aucune erreur ne se produit même s'il n'y a pas de paramètres requis.
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']
#
S'il y a un paramètre qui ne correspond pas au schéma, voluptuous.MultipleInvalid sera envoyé et J'obtiens un message indiquant que la valeur du paramètre (opération dans l'exemple) est incorrecte.
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']
C'est également le cas lorsque la fonction de validation est spécifiée.
Recommended Posts