🍿
JSON データ量産環境構築 バリデーション・スニペット編
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"
}
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 | |
3 | |
4 | |
5 |
3. まとめ
今回は VSCode で JSON データを量産する前準備を行いました。
簡単な JSON スキーマを作成し、JSON ファイルに適用されることを確認しました。
次回は、このスキーマをもう少し充実させていきます。
以上
Discussion