2012-09-17 5 views
17

Gibt es eine Python-Bibliothek zum Konvertieren eines JSON-Schemas in eine Python-Klassendefinition, ähnlich wie jsonschema2pojo - https://github.com/joelittlejohn/jsonschema2pojo - für Java?Konvertieren eines JSON-Schemas in eine Python-Klasse

+0

Können Sie näher erläutern, warum die Funktionalität des Standardbibliotheksmoduls [json] (http://docs.python.org/library/json.html) für Ihre Anforderungen nicht ausreicht und Sie die generierten Klassendefinitionen benötigen? –

+5

Die Antwort auf Ihren Kommentar ist ziemlich einfach - das Arbeiten mit rohen Wörterbüchern ist eine Objektverwaltung der zweiten Klasse und die meisten Menschen mögen die geschossene Schrotflinte nicht mit dem Gesicht, das JSON bietet. – synthesizerpatel

Antwort

17

Bisher ist die nächste, was ich habe, ist warlock in der Lage zu finden, die diesen Workflow bewirbt:

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

Erstellen Sie ein Modell

Bauen Sie Ihr Schema

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

Erstellen Sie ein Objekt mit Ihrem Modus l

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

Allerdings ist es nicht ganz so einfach. Die Objekte, die Warlock produziert, fehlen in der Art von introspektablen Leckerbissen. Und wenn es verschachtelte Dicts bei der Initialisierung unterstützt, konnte ich nicht herausfinden, wie sie funktionieren.

Um ein wenig Hintergrund zu geben, war das Problem, an dem ich arbeitete, wie man Chrome's JSONSchema API nehmen und einen Baum von Anfragegeneratoren und Antworthandlern erzeugen. Warlock scheint nicht allzu weit daneben zu liegen, der einzige Nachteil ist, dass Meta-Klassen in Python nicht wirklich in "Code" umgewandelt werden können.

Weitere nützliche Module suchen:

  • jsonschema - (der Warlock oben auf gebaut wird)
  • valideer - ähnlich wie jsonschema aber mit einem schlechteren Namen.
  • bunch - Eine interessante Struktur Bauer das ist auf halbem Weg zwischen a dotdict und construct

Wenn Sie Ihre Frage eine gute Lösung aus einer Hand für diese bitte folgen am Ende der Suche - ich würde gerne einen finden. Ich goss durch github, pypi, googlecode, sourceforge, etc .. Und konnte einfach nichts wirklich sexy finden.

Da es keine vorgefertigten Lösungen gibt, werde ich wahrscheinlich selbst etwas mit Warlock zusammen machen. Also, wenn ich dich dazu schlagen werde, werde ich meine Antwort aktualisieren. : P

+1

Dito auf Follow-up. Ich ging durch die gleichen Quellen und konnte keine akzeptable Lösung finden. Ich habe sogar Warlock gegabelt und angefangen, Rekursion in ihrer Klassendefinition zu implementieren (was anscheinend ziemlich einfach zu sein scheint), gab aber auf. –

5

python-jsonschema-objects ist eine Alternative zu warlock, zur Verwendung in Python

Python-jsonschema-Objekte bietet ein automatisches klassenbasierte Bindung an JSON Schemata auf der jsonschema zu bauen.

Verbrauch:

Probe Json Schema

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

Konvertieren des Schemaobjekt Klasse

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 

Validierung:

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

Aber Problem ist, es ist immer noch draft4validation, während jsonschema über draft4validation bewegt, ich habe eine Ausgabe auf dem Repo in Bezug auf diese eingereicht. Sofern Sie nicht die alte Version von jsonschema verwenden, funktioniert das obige Paket wie gezeigt.

Verwandte Themen