🍿

JSON データ量産環境構築 バリデーション・スニペット編

2024/01/08に公開

1. はじめに

JSON データを作成していて、以下のような経験ないでしょうか?

  • ここに入力するデータの型、仕様とあっていたかな。
  • 間違ってしまったことに、データ作成時に気付かなかった。
  • 途中で気付いたけど、既に大量に同様のファイルを作成していたので、直すのが面倒だった。

このような、データを大量・正確に生成したい時の課題について、
JSON スキーマを使って解決する方法を考えます。

2. 環境構築

本記事では JSON データを快適に作成する環境を作ります。
JSON データのエディタには Visual Studio Code を使います。

以下のようなワークスペースのファイル構成を採用します。

ワークスペース構成
. (ワークスペースルート)
├ .vscode                                        : VSCode ワークスペース設定用ディレクトリ
│ └ settings.json                                : 設定ファイル
├ schema                                         : JSON スキーマ用ディレクトリ
│ └ {schema-name}.schema.json                    : JSON スキーマ
└ data                                           : データ用ディレクトリ
  └ {data-name}-{serial-num}.{schema-name}.json  : JSON データ

2.1. JSON スキーマを作成する

本記事では、Webサービス等のユーザーデータを作成することを想定してスキーマを作成していきます。
ひとまず環境を作るまで以下のような簡単なスキーマで進めることにします。

schema/users.schema.json
{
  "$schema": "https://json-schema.org/draft-07/schema",
  "$id": "https://awesome-web-service.com/schema/users",
  "title": "ユーザー情報",
  "description": "Awesome Web Service におけるユーザーの情報を表します。",
  "type": "object",
  "properties": {
    "userId": {
      "type": "integer",
      "description": "ユーザーID",
      "minimum": 1
    },
    "name": {
      "type": "string",
      "description": "姓名",
      "pattern": "^[^ ]{1,} [^ ]{1,}$"
    },
    "birthDay": {
      "type": "string",
      "description": "誕生日",
      "format": "date"
    }
  },
  "required": [ "userId", "name", "birthDay" ]
}

このスキーマは以下のルールを表現しています。

  • ユーザー情報は、オブジェクト型でプロパティにユーザーID、姓名、誕生日を必須で持つ。
  • ユーザーIDは整数型で、1以上である必要がある。
  • 姓名は文字列型で、姓と名の間にスペースを1つ入れる必要がある。
  • 誕生日は RFC3339 (ISO8601) の日付形式文字列 (YYYY-MM-DD) である必要がある。

2.2. VSCode に JSON スキーマを参照させる

Mapping to a schema in the workspace - JSON editing in Visual Studio Code

.vscode/settings.json を以下の内容を含めて作成する。

.vscode/settings.json
"json.schemas": [
  {
    "fileMatch": [
      "/data/**/*.users.json"
    ],
    "url": "./schema/users.schema.json"
  }
]

2.3. JSON スキーマを使ったバリデーションができるか確認

以下のような JSON ファイルを作成し VSCode が警告してくれるのを確認する。

test-01.users.json / OK
{
  "userId": 1,
  "name": "慈英尊 好今",
  "birthDay": "1999-12-31"
}
test-01.users.json / NG userId が1未満
{
  "userId": 0, // NG 値が最小値の 1 を下回っています。
  "name": "慈英尊 好今",
  "birthDay": "1999-12-31"
}

NG userId が1未満

test-01.users.json / NG name スペースがない
{
  "userId": 1,
  "name": "慈英尊好今", // 文字列はパターン "^[^ ]{1,} [^ ]{1,}$" と一致しません。
  "birthDay": "1999-12-31"
}
test-01.users.json / NG birthDay が日付フォーマットになっていない
{
  "userId": 1,
  "name": "慈英尊 好今",
  "birthDay": "1999-12-3" // 文字列は RFC3339 日付ではありません。
}
test-01.users.json / NG プロパティが不足
{
}
// プロパティ "userId" が不足しています。
// プロパティ "name" が不足しています。
// プロパティ "birthDay" が不足しています。

2.4. JSON スキーマに沿ったスニペットを作成する

スニペットをスキーマに追加する。
Define snippets in JSON schemas - JSON editing in Visual Studio Code

schema/users.schema.json (スニペット設定例)
"defaultSnippets": [
  {
    "label": "テンプレート",
    "description": "データ作成用のテンプレートデータです。",
    "body": {
      "userId": "^${1:${RANDOM/^.*?([1-9][0-9]{0,2}).*$/$1/}}",
      "name": "${2:慈英尊 好今}",
      "birthDay": "${3:$CURRENT_YEAR}-${4:$CURRENT_MONTH}-${5:$CURRENT_DATE}"
    }
  }
]
  • userId は 2桁のランダム10進数
  • name慈英尊 好今 固定
  • birthDay は現在の日付

スニペット実行

スニペットメニュー

スニペット選択結果

2.5. JSON スキーマに沿ってサジェストする

defaultSnippets はオブジェクト単位ではなく、プロパティ単位でも設定できる。

schema/users.schema.json (プロパティ毎のスニペット追加)
"properties": {
  "userId": {
    "type": "integer",
    "description": "ユーザーID",
    "minimum": 1,
+   "defaultSnippets": [
+     {
+       "label": "ランダム",
+       "description": "ランダムなユーザーIDを生成します。",
+       "body": "^${RANDOM/^.*?([1-9][0-9]{0,1}).*$/$1/}"
+     }
+   ]
  },
  "name": {
    "type": "string",
    "description": "姓名",
    "pattern": "^[^ ]{1,} [^ ]{1,}$",
+   "defaultSnippets": [
+     {
+       "label": "慈英尊 好今",
+       "body": "慈英尊 好今"
+     }
+   ]
  },
  "birthDay": {
    "type": "string",
    "description": "誕生日",
    "format": "date",
+   "defaultSnippets": [
+     {
+       "label": "現在日付",
+       "body": "$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE"
+     }
+   ]
  }
},
ステップ キャプチャ
1 プロパティ値なし
2 プロパティ値1
3 プロパティ値2
4 プロパティ値3
5 プロパティ値完成

3. まとめ

今回は VSCode で JSON データを量産する前準備を行いました。
簡単な JSON スキーマを作成し、JSON ファイルに適用されることを確認しました。
次回は、このスキーマをもう少し充実させていきます。

以上

Discussion