工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

Pythonのjsonschemaを試しに使う

Pythonのjsonschemaパッケージを使ってみた。


環境


インストール

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スキーマの仕様を全部把握できていないが、とりあえずすぐに使う必要がありそうなものは試せた。