Pythonのjsonschemaパッケージを使ってみた。
環境
- Python 3.7.7
インストール
pip install jsonschema
試用
汎用的に使える基底クラスを作ってみた。
import json import jsonschema import typing class DefinedJson: _SCHEMA = {} def __init__(self): self._schema = self._SCHEMA @property def schema(self): return self._schema @schema.setter def schema(self, x: dict): self._schema = x def read_schema(self, filepath: str): """ filepath: スキーマ定義ファイルパス """ try: with open(filepath) as fo: self.schema = json.loads(fo) return True except: return False def validate(self, data: dict, on_invalid: (callable, typing.Any)=None): """ Parameters -------------- data: 検査対象 on_invalid: 不正の場合のユーザー定義処理(func(message: str, args: any), args) message: エラーメッセージ args: ユーザー引数 Returns -------------- tf: boolean 成否 """ try: jsonschema.validate(data, self._schema) return True except jsonschema.ValidationError as e: if on_invalid is not None: on_invalid[0](e.message, on_invalid[1]) return False
スクリプト
サンプルのクラスを作成して、呼び出してみた。
class Sample(DefinedJson): _SCHEMA = { "required": [ "name", "age" ], "type": "object", "properties": { "name": { "type": "string" }, "age": { "type": "integer", "minimum": 0, "maximum": 100 }, "weight": { "type": "number", "minimum": 0 }, "height": { "type": "number", "minimum": 0 }, "country": { "type": "string", "enum": ["Japan", "America", "Others"] } } } def __init__(self): super().__init__() if __name__ == "__main__": dj = Sample() data = { "name": "test", "age": 8, "weight": 6.7, "country": "China" } def on_invalid(msg, args): print("on_invalid", msg, args) print(dj.validate(data, (on_invalid, None)))
実行結果は以下。エラーを検出できている。
on_invalid 'China' is not one of ['Japan', 'America', 'Others'] None False
まとめ
JSONスキーマの仕様を全部把握できていないが、とりあえずすぐに使う必要がありそうなものは試せた。