** Je ne l'ai pas remarqué du tout quand je l'ai écrit, mais maintenant il semble qu'il soit passé à schematics
. J'écrirai bientôt la version schematics
... peut-être. ** **
dictshield
est une bibliothèque pour valider des objets JSON.
Comme il peut être défini par classe, il semble facile à utiliser car il est similaire au modèle et à la classe de formulaire de django
que j'utilise habituellement, à la classe de document de mongoengine
, etc., et la base de code est compacte et la visibilité est bonne. procès. Au fur et à mesure que vous suivez le code, il semble que MongoDB et JSON Schema soient également pris en compte.
documents.py
from dictshield.document import Document
from dictshield.fields import StringField, IntField, FloatField, BooleanField, DateTimeField
class SampleDocument(Document):
id = IntField(min_value=0)
name = StringField()
gps_attached = BooleanField()
temperature = FloatField()
created_at = DateTimeField()
L'inspection des objets JSON convertit l'objet JSON en «dict», puis le jette dans la classe de document.
import json
json_data = '{"id": 1, "name": "foo", "gps_attached": true, "temperature": 23.5, "created_at": "2013-01-01T12:34:56" }'
data = json.loads(json_data)
document = SampleDocument(**data)
document.validate() #True est retourné
Pour utiliser un objet JSON imbriqué (?), Utilisez la classe ʻEmbeddedDocument`. Un exemple de séparation des informations des capteurs périphériques.
documents.py
from dictshield.document import Document, EmbeddedDocument
from dictshield.fields import StringField, IntField, FloatField, BooleanField, DateTimeField
from dictshield.fields.compound import EmbeddedDocumentField
class PeripheralEmbeddedDocument(EmbeddedDocument):
gps_attached = BooleanField()
temperature = FloatField()
class SampleDocument(Document):
id = IntField()
name = StringField(max_length=5)
created_at = DateTimeField()
peripheral = EmbeddedDocumentField(PeripheralEmbeddedDocument)
data = {
u'created_at': u'2013-01-01T12:34:56',
u'id': 1,
u'name': u'foo',
u'peripheral': {
u'gps_attached': True,
u'temperature': 23.5
}
}
document = SampleDocument(**data)
document.validate() #True est retourné
Si la validation échoue, une ShieldException sera lancée.
data = {
u'created_at': u'2013-01-01T12:34:56',
u'id': 1,
u'name': u'hogheoge', #longue
u'peripheral': {
u'gps_attached': True,
u'temperature': 23.5
}
}
document = SampleDocument(**data)
document.validate()
---------------------------------------------------------------------------
ShieldException Traceback (most recent call last)
<ipython-input-76-8d15894a526a> in <module>()
----> 1 document.validate()
/somewhere/lib/python2.7/site-packages/dictshield/document.pyc in validate(self, validate_all)
333 # NB: raising a ShieldDocException in this case would be more
334 # consistent, but existing code might expect ShieldException
--> 335 raise err
336
337 if errs:
ShieldException: String value is too long - name:hogheoge
max_value
et min_value
de ʻIntField` ne fonctionnent pas ...Recommended Posts