Python

【Python】データ構造管理にはJSONスキーマがおすすめである3つの理由

2022年11月26日

※ 本ブログはプロモーションが含まれています

ポロシャツエンジニア

3分で技術が身に付くブログ!
・ポロシャツを愛するエンジニア
・企業にて研究開発職
・画像処理 | Deep Learning

Pythonにて、データ構造管理にはJSON スキーマがおすすめである3つの理由を紹介します!

おすすめの読者

  • JSONやCSV等のデータフォーマットのどれを使うべきか迷っている方
  • JSONデータフォーマットの良さを知りたい方
  • データ構造を柔軟に設計したい方

【結論】データ構造管理にはJSONスキーマを活用すべき!

結論、データ構造管理にはJSON スキーマを活用すべきです
本記事の内容を深く理解するためには、 入門 Python 3 Effective Python Pythonプログラムを改良する90項目 がおすすめです!

理由3選

  • JSONのデータ構造を定義することができるため!
  • データ構造のバージョン管理ができるようになるため!
  • データ構造を検証を行うことができるため!

【理由】データ構造管理にはJSONスキーマを活用すべき3つの理由

JSONのデータ構造を定義することができるため!

JSONスキーマとは、JSONのデータ構造をJSONそのもので定義するものです。
JSONスキーマを活用することで、JSONのデータ構造を容易に把握・管理することができるようになります!

下記、JSON-Schemaのサイトより引用させていただいたサンプルになります。
このようなJSONファイルのデータ構造を予め定義しておきたいとします。

{
  "firstName": "John",
  "lastName": "Doe",
  "age": 21
}

その場合、下記のようなJSONスキーマを別途作成することにより、上記のJSONファイルのデータ構造を定義することができます!

{
  "$id": "schema_v1.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Person",
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string",
      "description": "The person's first name."
    },
    "lastName": {
      "type": "string",
      "description": "The person's last name."
    },
    "age": {
      "description": "Age in years which must be equal to or greater than zero.",
      "type": "integer",
      "minimum": 0
    }
  }
}

JSONでは下記のデータ形式を取り扱うことができ、JSONスキーマを活用することで、データ構造の定義を行うことができます!

  • 文字列
  • 数値
  • null
  • bool値
  • オブジェクト(ネスト化されたデータ構造)
  • 配列(多次元配列含む)

データ構造のバージョン管理ができるようになるため!

JSONスキーマを活用することで、データのバージョン管理を行うことができます!
これにより、データ構造に変更があった場合でも、トレーサビリティの担保が実現可能です!
データ構造に変更が加わる可能性がある場合は、JSONスキーマの活用が有効です!

具体的な例示を紹介いたします。
プロジェクト当初は、下記のようなデータ構造で管理していたと仮定します。

{
  "firstName": "John",
  "lastName": "Doe",
  "age": 21
}
{
  "$id": "schema_v1.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Person",
  "type": "object",
  "properties": {
    "firstName": {
      "type": "string",
      "description": "The person's first name."
    },
    "lastName": {
      "type": "string",
      "description": "The person's last name."
    },
    "age": {
      "description": "Age in years which must be equal to or greater than zero.",
      "type": "integer",
      "minimum": 0
    }
  }
}

しかし、プロジェクト途中でJSONのデータ構造の出力を変更すると取り決まりしました。

{
  "name": {
    "firstName": "John",
    "lastName": "Doe"
  },
  "age": 21,
  "weight": 65.5
}

その場合、「schema_v2.json」として新たにスキーマを定義し、バージョン管理を行います!

{
  "$id": "schema_v2.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Person",
  "type": "object",
  "properties": {
    "name": {
      "type": "object",
      "properties": {
        "firstName": {
          "type": "string",
          "description": "The person's first name."
        },
        "lastName": {
          "type": "string",
          "description": "The person's last name."
        }
      }
    },
    "age": {
      "description": "Age in years which must be equal to or greater than zero.",
      "type": "integer",
      "minimum": 0
    },
    "weight": {
      "description": "Weight which must be greater than one.",
      "type": "number",
      "minimum": 1
    }
  }
}

これにより、schema_v1.json・schema_v2.jsonの2つのデータ構造が定義されました!
Schemaに定義されたデータ構造と一致するかを検証することにより、データ構造のバージョン管理を行うことができるようになります!

データ構造を検証を行うことができるため!

Pythonではjsonschemaライブラリ活用することで、データ構造の検証を行うことができます!
データ構造のバージョン検証や不正入力検知を行うことができます!

jsonschemaライブラリの詳細な活用方法に関しては、こちらのサイトがおすすめです!
本記事ではPython APIを用いて、JSONスキーマを用いたデータ構造の検証方法を紹介します!

  • JSONスキーマの読み込み
  • JSONデータの読み込み
  • `jsonschema.validate`を用いて、データ構造の検証
import json
import jsonschema

# スキーマの読み込み
with open('schema_v1.json') as f:
    json_schema = json.load(f)
  
# JSONデータの読み込み
with open('xxx.json') as f:
    json_data = json.load(f)

json.validate(json_data, json_schema)

複数定義されたJSONスキーマに対して、一致するかを検証する場合は以下のように記述します。

import json
import jsonschema

# スキーマの読み込み
with open('schema_v1.json') as f:
    json_schema_v1 = json.load(f)
with open('schema_v2.json') as f:
    json_schema_v2 = json.load(f)
  
# JSONデータの読み込み
with open('xxx.json') as f:
    json_data = json.load(f)

try:
    json.validate(json_data, json_schema_v1)
    print("matched v1 schema")
except json.ValidationError as e:
    print("not matched v1 schema")

try:
    json.validate(json_data, json_schema_v2)
    print("matched v2 schema")
except json.ValidationError as e:
    print("not matched v2 schema")

【まとめ】データ構造管理にはJSONスキーマを活用すべき!

結論、データ構造管理にはJSONスキーマを活用すべきです
本記事の内容を深く理解するためには、 入門 Python 3 Effective Python Pythonプログラムを改良する90項目 がおすすめです!

理由3選

  • JSONのデータ構造を定義することができるため!
  • データ構造のバージョン管理ができるようになるため!
  • データ構造を検証を行うことができるため!


中級・上級者にはこちらがおすすめ!
中級・上級者にはこちらがおすすめ!
  • この記事を書いた人

ポロシャツエンジニア

3分で技術が身に付くブログ!
・ポロシャツを愛するエンジニア
・企業にて研究開発職
・画像処理 | Deep Learning

-Python