Python
 Computer >> コンピューター >  >> プログラミング >> Python

JSONスキーマからPythonクラスを自動生成する方法【python-jsonschema-objects活用ガイド】

JSONオブジェクトからPythonクラスを作成するには?

JSONデータをPythonで扱う際、辞書型のまま操作すると属性アクセスができず、コードの可読性が低下しがちです。そんなときに便利なのが python-jsonschema-objects というライブラリです。このライブラリは、広く使われている jsonschema を基盤として構築されており、JSONスキーマから自動的にクラスベースのバインディング(クラス定義)を生成し、Python上でオブジェクトのように直感的に扱えるようにしてくれます。

この記事では、サンプルのJSONスキーマを使って、実際にPythonクラスを生成し、値の検証まで行う手順を解説します。

1. サンプルとなる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"]
} '''

このスキーマでは、firstNamelastName が必須項目(required)として指定され、age には0以上という制約、dogs には最大4件までという制限が設けられています。

2. スキーマオブジェクトをPythonクラスへ変換する

続いて、python_jsonschema_objects をインポートし、スキーマからクラスをビルドします。以下のコードを実行すると、スキーマ定義に対応したクラスが自動生成されます。

import python_jsonschema_objects as pjs

# ObjectBuilderにスキーマを渡してビルド
builder = pjs.ObjectBuilder(schema)
ns = builder.build_classes()

# 生成されたクラスを取得
Person = ns.ExampleSchema

# インスタンスを作成
jack = Person(firstName="Jack", lastName="Sparrow")

# 属性にアクセス
jack.lastName
# → example_schema lastName=Sparrow age=None firstName=Jack

ポイントは、build_classes() の戻り値から、スキーマの title(ここでは ExampleSchema)に対応するクラスを取り出せる点です。生成されたクラスは通常のPythonクラスと同様にキーワード引数で初期化でき、jack.lastName のように属性アクセスで値を参照できます。

3. バリデーション(検証)も自動的に行われる

python-jsonschema-objects の大きな利点は、スキーマで定義した制約に基づいて自動的に入力値を検証してくれることです。たとえば、年齢にマイナスの値を代入してみると、エラーが発生します。

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

スキーマで「age は0以上」と定義していたため、不正な値 -2 を代入した時点で ValidationError が送出されます。これにより、不正なデータがプログラム内に入り込むのを未然に防げます。

まとめ

  • python-jsonschema-objects を使えば、JSONスキーマから自動的にPythonクラスを生成できる。
  • 生成されたクラスは属性アクセスが可能で、コードの可読性と保守性が向上する。
  • スキーマに定義した型や制約(最小値・最大件数・enumなど)に基づき、自動バリデーションが行われる。

APIレスポンスや設定ファイルなど、構造化されたJSONデータを安全かつ効率的に扱いたい場面で、ぜひこのライブラリを活用してみてください。

  1. Pythonで名前空間を作成する方法をわかりやすく解説

    Pythonでは、パッケージ、モジュール、クラス、関数、メソッドのそれぞれが独自の「名前空間(namespace)」を持っており、変数名はこの名前空間の中で解決されます。そして、関数やモジュール、パッケージが評価される(つまり実行が開始される)タイミングで、新しい名前空間が自動的に生成されます。そのため、名前空間を作成したい場合は、以下のいずれかの操作を行うだけで実現できます。関数を呼び出すオブジェクトをインスタンス化するモジュールをインポートするパッケージをインポートする例えば、「Namespace」というクラスを定義し、そのクラスのインスタンスを生成すれば、そのオブジェクト自体が一つの名前

  2. Python関数からJSONオブジェクトを返す方法をわかりやすく解説

    Pythonの関数からJSONオブジェクト(JSON形式の文字列)を返すには、標準ライブラリの json モジュールに含まれる json.dumps() 関数を使用します。この関数は、Pythonの辞書(dict)などのオブジェクトをJSON形式の文字列へ変換(シリアライズ)してくれます。 基本的な例 以下は、Pythonの辞書をJSON文字列に変換して返す関数のシンプルな例です。 import json # Pythonの辞書 a = {name: Sarah, age: 24, isEmployed: True} def retjson(): python2json = jso