[Python] Validation de JSON avec Voluptuous

Comment effectuer la validation des valeurs JSON à l'aide de la bibliothèque Voluptuous en Python.

Qu'est-ce que Voluptuous?

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

Python 2.6 et supérieur

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())

Détails

Terme voluptueux

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.

Méthode de validation

L'un des suivants

  1. Spécification directe des valeurs possibles. Il est également possible d'avoir une largeur avec Any, Range, etc.
  2. Classe (Int, float, etc., six.text_type peuvent être spécifiés) --Toute valeur est OK tant que les classes correspondent
  3. Spécifiez la fonction de validation

Exemple d'opération

environnement

Exemple de fonctionnement normal

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'}
#

Exemple de fonctionnement normal (paramètres obligatoires omis)

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.

Exemple d'opération d'erreur

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.

Exemple d'opération d'erreur (lorsque la fonction de validation est spécifiée)

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

[Python] Validation de JSON avec Voluptuous
Python #JSON
Valider les objets JSON à l'aide de Python DictShield
Commencez à utiliser Python
Scraping à l'aide de Python
Manipuler Redmine à l'aide de Python Redmine
[Python] Utiliser JSON avec Python
Séquence de Fibonacci utilisant Python
Manipulation de json en python
Nettoyage des données à l'aide de Python
Utilisation des packages Python #external
Installez Voluptuous avec Python 2.5
Câblage Communication Pi-SPI avec Python
Calcul de l'âge à l'aide de python
Rechercher sur Twitter avec Python
Identification de nom à l'aide de python
Notes sur l'utilisation de sous-processus Python
Essayez d'utiliser Tweepy [Python2.7]
mémo python utilisant l'opérateur perl-ternaire
Aplatir à l'aide du rendement Python de
Enregistrer des images à l'aide de requêtes python3
[S3] CRUD avec S3 utilisant Python [Python]
[Python] Essayez d'utiliser le canevas de Tkinter
POST json avec le script Python 3
Utilisation de Quaternion avec Python ~ numpy-quaternion ~
Essayez d'utiliser Kubernetes Client -Python-
notes python pour l'utilisation de variables spéciales perl
Scraping à l'aide de la syntaxe Python 3.5 Async
Surveillance des changements de site Web à l'aide de python
Publier sur Twitter en utilisant Python
Algorithme de recherche utilisant word2vec [python]
Changer la version de python à l'aide de pyenv
python: principes de base de l'utilisation de scikit-learn ①
# 1 [python3] Calcul simple à l'aide de variables
Désactiver la validation SSL sans utiliser verify = False dans les requêtes Python
Créer des tickets JIRA en utilisant Python
Contrôle d'instruments à l'aide de Python [pyvisa]
Manipulez les feuilles de calcul localement à l'aide de Python
mémo python utilisant perl --join
Python: validation Jwa / Jwe ECDH-ES
Web scraping avec Selenium (Python)
Diffusion sur LINE en utilisant python
Formater json avec Vim (avec python)
Analyse de données à l'aide de pandas python
Traduit à l'aide de googletrans en Python
Utilisation du mode Python dans le traitement
Utiliser OpenCV avec Python @Mac
[Python] Jeu de tir avec pyxel
Envoyer en utilisant Python avec Gmail
Lire des données json avec python
Compléter python avec emacs en utilisant company-jedi
Comment installer Python à l'aide d'Anaconda
Moyenne harmonique par Python (en utilisant SciPy)
[Python] Chargement de fichiers csv à l'aide de pandas
Programmation GUI en Python avec Appjar
Remarque Python: à propos de la comparaison en utilisant is
[Ubuntu] [Python] Suivi d'objets à l'aide de dlib
Capture d'image de Firefox en utilisant Python