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のデータ構造を定義することができるため!
- データ構造のバージョン管理ができるようになるため!
- データ構造を検証を行うことができるため!