2012-09-17 21 views
17

¿Hay una biblioteca python para convertir un esquema JSON en una definición de clase python, similar a jsonschema2pojo - https://github.com/joelittlejohn/jsonschema2pojo - para Java?Convierta un esquema JSON en una clase python

+0

¿Puede explicar por qué la funcionalidad del módulo de biblioteca estándar [json] (http://docs.python.org/library/json.html) no es suficiente para sus necesidades y necesita las definiciones de clase generadas? –

+5

La respuesta a su comentario es bastante simple: trabajar con diccionarios sin procesar es una gestión de objetos de segunda clase y a la mayoría de las personas no les gusta la ráfaga de escopeta de soporte rizado en la cara que proporciona JSON. – synthesizerpatel

Respuesta

17

Hasta ahora lo más parecido que he podido encontrar es warlock, que anuncia este flujo de trabajo:

Construir el esquema de

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

crear un modelo

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

Crea un objeto usando tu modo l

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

Sin embargo, no es tan fácil. Los objetos que produce Brujo carecen en gran medida de golosinas introspectibles. Y si es compatible con dicts anidados en la inicialización, no pude averiguar cómo hacer que funcionen.

Para dar un poco de antecedentes, el problema en el que estaba trabajando era cómo tomar Chrome's JSONSchema API y generar un árbol de generadores de solicitudes y controladores de respuestas. Warlock no parece estar demasiado lejos de la realidad, el único inconveniente es que las metaclases en Python no se pueden convertir realmente en 'código'.

Otros módulos útiles para buscar:

  • jsonschema - (que Warlock se construye en la parte superior de)
  • valideer - similar a jsonschema pero con un nombre peor.
  • bunch - Un constructor estructura interesante eso es la mitad de camino entre a dotdict y construct

Si al final de encontrar una buena solución única para este siga su pregunta - Me encantaría encontrar uno. Me serví github, pypi, googlecode, sourceforge, etc. Y no pude encontrar nada realmente sexy.

Por falta de soluciones prefabricadas, probablemente improvisaré algo con Warlock. Entonces, si te gano, actualizaré mi respuesta. : P

+1

Ídem en el seguimiento. Pasé por las mismas fuentes y no pude encontrar ninguna solución aceptable. Incluso bifurqué a warlock y comencé a trabajar en la implementación de la recursión en su definición de clase (que parece que debería ser bastante fácil), pero me rendí. –

5

python-jsonschema-objects es una alternativa a brujo, construir en la parte superior de jsonschema

python-jsonschema-objetos proporciona una basada en la clase automática unión a esquemas JSON para su uso en pitón.

Uso: Esquema

Muestra 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"] 
} ''' 

la conversión del objeto de esquema para la clase

import python_jsonschema_objects as pjs 
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 

Validación:

james.age = -2 python_jsonschema_objects.validators.ValidationError: -2 was less or equal to than 0

Pero el problema es que todavía está usando draft4validation mientras jsonschema se ha movido sobre draft4validation, archivé número en el repositorio al respecto. A menos que esté usando la versión anterior de jsonschema, el paquete anterior funcionará como se muestra.

Cuestiones relacionadas