経緯
cloud functionsでAPI作るにあたって入力をjsonで受け取るようにしたが、validationどうしようと調べてたらJSON Schemaという素敵なものと出会った。
単純に必須項目や文字列、数値などのスキーマ定義するだけならそれほど悩まず書けるが、radioボタンの入力項目などもう少し制限かけたいなーという欲が出たので調べて見た。
前提
JSON Schemaはdraft-06で動作確認しています。
JSON Schema | The home of JSON Schema
NULLを許容したい
typeを配列にしてnullを許容するように記載すればOK。
"nullable": {
"type": [
"string",
"null"
]
}
特定の項目の中から選択されているか確認したい
radioボタンなど入力項目が特定の内容に決まっている場合にはenumを使えばOK。
"selected": {
"type": "string",
"enum": [
"dog",
"cat",
"monkey"
]
}
複数選択可の場合は以下のように書ける。
"multiselected": {
"type": "array",
"items": {
"type": "string",
"enum": [
"dog",
"cat",
"monkey"
]
}
}
複数選択可だが最低1つ選択させたい
複数選択可のselect boxなどで未設定はNGという場合にはminItemsを指定すればOK。
"requiredselected": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"enum": [
"dog",
"cat",
"monkey"
]
}
}
URLやEMAILなど特定のフォーマットの文字列か確認したい
formatを指定すればOK。指定できるフォーマットはこちらを確認ください。
"url": {
"type": "string",
"format": "uri"
}
ちょうどいいformatがない場合は正規表現が使えるpatternを使うこともできます。(\dが使えないなど少々使いづらいが)
数値が範囲内か確認したい
minimumとmaximumを指定すればOK。
"range": {
"type": "number",
"minimum": 0,
"maximum": 100
}
最小値、最大値を含めたくない場合はexclusiveMinimum(Maximum)をFalseにすればOK。
特定の数値の倍数が設定されているか確認したい
multipleOfを指定すればOK。
"price": {
"type": "number",
"multipleOf": 100
}
ただ、multipleOfに0.1などの少数を指定すると精度の関係でvalidationの結果が予期しない結果になりかねないので、少数は基本使わない。