web-dev-qa-db-ja.com

JSONスキーマをpythonクラスに変換します

JSONスキーマをpythonクラス定義に変換するためのpythonライブラリがあり、jsonschema2pojoに似ています (https://github.com/joelittlejohn/jsonschema2pojo -Javaの場合?

27
JD White

これまでのところ、私が見つけた最も近いものは warlock で、このワークフローを宣伝しています。

スキーマを作成します

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

モデルを作成します

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

モデルを使用してオブジェクトを作成します

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

しかし、それはそれほど簡単ではありません。ウォーロックが生成するオブジェクトは、内省可能なグッズの点で多くを欠いています。また、初期化時にネストされた辞書をサポートしている場合、それらを機能させる方法を理解できませんでした。

少し背景を説明すると、私が取り組んでいた問題は ChromeのJSONSchema API を取得して、リクエストジェネレーターとレスポンスハンドラーのツリーを作成する方法でした。ウォーロックはあまり目立たないように見えませんが、唯一の欠点は、Pythonのメタクラスを実際に「コード」に変換できないことです。

探すべき他の有用なモジュール:

このための適切なワンストップソリューションを見つけた場合は、質問をフォローアップしてください-見つけたいと思います。私はgithub、pypi、googlecode、sourceforgeなどに注ぎました。そして、本当にセクシーなものを見つけることができませんでした。

事前に作成されたソリューションがないため、私はおそらくウォーロックと一緒に何かを考え出すでしょう。だから私があなたを倒した場合、私は私の答えを更新します。 :p

23

python-jsonschema-objects はウォーロックの代替であり、jsonschemaの上に構築します

python-jsonschema-objectsは、Pythonで使用するJSONスキーマへのクラスベースの自動バインディングを提供します。

用途:

サンプル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"]
} '''

スキーマオブジェクトをクラスに変換する

 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  

検証:

james.age = -2 python_jsonschema_objects.validators.ValidationError:-2は0以下でした

しかし問題は、jsonschemaがdraft4validationに移動している間、それがまだdraft4validationを使用していることです。これに関するリポにissueを提出しました古いバージョンのjsonschemaを使用していない限り、上記のパッケージは次のように動作します。

14
igaurav

pythonを扱う場合でも、jsonスキーマからコードクラスを生成するために、この小さなプロジェクトを作成しました。ビジネスプロジェクトで作業するときに役立つと思います。

pip install jsonschema2popo

次のコマンドを実行すると、pythonモジュールが生成されます(jinja2テンプレートを使用します)

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

詳細: https://github.com/frx08/jsonschema2popo

3
frx08