web-dev-qa-db-fra.com

Convertir un schéma JSON en une classe python

Existe-t-il une bibliothèque python pour convertir un schéma JSON en une définition de classe python, similaire à jsonschema2pojo - https://github.com/joelittlejohn/jsonschema2pojo - pour Java?

27
JD White

Jusqu'à présent, la chose la plus proche que j'ai pu trouver est warlock , qui annonce ce flux de travail:

Construisez votre schéma

>>> schema = {
    'name': 'Country',
    'properties': {
        'name': {'type': 'string'},
        'abbreviation': {'type': 'string'},
    },
    'additionalProperties': False,
}

Créer un modèle

>>> import warlock
>>> Country = warlock.model_factory(schema)

Créez un objet en utilisant votre modèle

>>> sweden = Country(name='Sweden', abbreviation='SE')

Cependant, ce n'est pas aussi simple que cela. Les objets que Warlock produit manquent beaucoup de goodies introspectibles. Et s'il prend en charge les dict imbriqués lors de l'initialisation, je n'ai pas pu comprendre comment les faire fonctionner.

Pour donner un peu de contexte, le problème sur lequel je travaillais était de savoir comment prendre API JSONSchema de Chrome et produire une arborescence de générateurs de requêtes et de gestionnaires de réponses. Warlock ne semble pas trop loin de la réalité, le seul inconvénient est que les méta-classes de Python ne peuvent pas vraiment être transformées en "code".

Autres modules utiles à rechercher:

Si vous finissez par trouver une bonne solution unique pour cela, veuillez suivre votre question - j'adorerais en trouver une. J'ai versé à travers github, pypi, googlecode, sourceforge, etc. Et je n'ai rien trouvé de vraiment sexy.

Faute de solutions prédéfinies, je vais probablement bricoler quelque chose avec Warlock moi-même. Donc, si je vous bat, je mettrai à jour ma réponse. : p

23
synthesizerpatel

python-jsonschema-objects est une alternative au démoniste, construit sur jsonschema

python-jsonschema-objects fournit une liaison automatique basée sur une classe aux schémas JSON à utiliser en python.

Utilisation:

Exemple de schéma Json

schema = '''{
    "title": "Example Schema",
    "type": "object",
    "properties": {
        "firstName": {
            "type": "string"
        },
        "lastName": {
            "type": "string"
        },
        "age": {
            "description": "Age in years",
            "type": "integer",
            "minimum": 0
        },
        "dogs": {
            "type": "array",
            "items": {"type": "string"},
            "maxItems": 4
        },
        "gender": {
            "type": "string",
            "enum": ["male", "female"]
        },
        "deceased": {
            "enum": ["yes", "no", 1, 0, "true", "false"]
            }
    },
    "required": ["firstName", "lastName"]
} '''

Conversion de l'objet de schéma en classe

 import python_jsonschema_objects as pjs
 import json
 schema = json.loads(schema)   
 builder = pjs.ObjectBuilder(schema)   
 ns = builder.build_classes()   
 Person = ns.ExampleSchema   
 james = Person(firstName="James", lastName="Bond")   
 james.lastName  
  u'Bond'  james      
 example_schema lastName=Bond age=None firstName=James  

Validation :

james.age = -2 python_jsonschema_objects.validators.ValidationError: -2 était inférieur ou égal à 0

Mais le problème est qu'il utilise toujours draft4validation alors que jsonschema a déplacé draft4validation, j'ai déposé un problème sur le référentiel à ce sujet. Sauf si vous utilisez une ancienne version de jsonschema, le package ci-dessus fonctionnera comme indiqué.

14
igaurav

Je viens de créer ce petit projet pour générer des classes de code à partir du schéma json, même s'il s'agit de python je pense que cela peut être utile lorsque l'on travaille dans des projets d'entreprise:

pip install jsonschema2popo

l'exécution de la commande suivante générera un module python contenant les classes définies par json-schema (il utilise le modèle jinja2)

jsonschema2popo -o /path/to/output_file.py /path/to/json_schema.json

plus d'informations sur: https://github.com/frx08/jsonschema2popo

3
frx08