こんにちは、年末年始に備えて減量中の八巻です。
この記事は「ネクストスケープ クラウド事業本部 Advent Calendar 2017」の 12/13 の記事です。
イントロダクション
Azure CosmosDBのDocumentDBを使って動的に管理できるAPIを開発しており、APIのデータ(JSON)を検証するためにJSON Schemaを使用しています。JSON Schemaとは、「JSONの構造を定義したJSON」です。この記事は、JSON Schemaの記法のうちバリデーションについてまとめたものです。仕様は執筆時点のバージョン(Draft-07)に基づいています。
開発中のプログラム内では以下のライブラリを使用してバリデーションをしています。
type
最初に覚えるべきキーワードは"type"です。"type"は型情報を表します。
以下の型が使用可能です。
- string:文字列
- "Dream"
- "夏目漱石"
- "110"
- number:浮動小数点や指数表記を含むことができる数値
- 3
- 3.14156926
- 2.99792458e8
- integer:整数値
- 1
- 100
- -20
- object:オブジェクト
- {"name":"開発太郎","gender":"male","age":32}
- array:配列
- [100,200,300,200]
- ["Apple","Banana","Candy"]
- boolean:真偽値
- true
- false
- null:null値
- null
最もかんたんな例
以下のJSON SchemaはJSONが文字列であることを検証します。
有効なJSON
無効なJSON
複数の型を有効とする例
"type"を配列とすることで複数の型を有効とすることができます。 以下の例は整数型もしくはnullを有効とします。
objectの検証
基本
"properties"キーワードでobject内部のフールドの検証を定義します。
以下は人物のJSONを検証するJSON Schemaです。"title"キーワードはフィールド名を表すメタ情報です。
有効なJSON
定義外のフィールドがあったり、定義したフィールドが不足していても有効です。
次節では定義したフィールドが存在することの検証や未定義のフィールドの検証について解説します。
必須項目
"required"キーワードでobjectのフィールドの必須項目を定義することができます。
以下の例は名前と年齢を必須としています。
有効なJSON
無効なJSON
以下の例は"age"がないため無効です。
定義外のフィールドがあった場合無効とする
"additionalProperties"キワードは定義外のフィールドに対する検証です。 falseとすることで定義外のフィールドが含まれた場合に無効となります。
以下は無効となります。
定義外のフィールドに制約を定義する
"additionalProperties"キーワードは定義外のフィールドに制約を付ける場合にも使用できます。 以下は定義外のフィールドがあってもそれが文字列であれば有効とする例です。
有効なJSON
無効なJSON
配列の検証
基本
"items"キーワードで配列の要素の検証を定義します。 数値の配列であることを検証する。
人物オブジェクトの配列であることを検証する。
配列のn番目の要素の検証を設定する。
"items"キーワードでは配列のN番目の要素について検証することが可能です。 objectの"properties"の使い方に似ています。 以下は1番目の要素は整数型で、2番めの要素は文字列型であることを検証します。
有効なJSON
要素の過不足は検証しないので以下のいずれも有効です。
"additionalItems"キーワードでその後の要素に制約をつけることも可能です。
後続の要素を許可しない例
後続の要素は数値のみ許可する例
その他
ここまで呼んでいただければ下記の検証キーワードの使い方は想像可能だと思います。
stringの検証
- maxLength:最大文字数。
- minLength:最小文字数。
- pattern:正規表現による検証。正規表現文字列
- format:日付、メールアドレス、URL等定められたフォーマットによる検証。
numberとintegerの検証
- minimum:最小値
- exclusiveMinimum:trueを設定するとminimumで定義した最小値と等しい値は不許可となる。
- maximum:最大値
- exclusiveMaximum:trueを設定するとmaximumで定義した最大値と等しい値は不許可となる。
- multipleOf: この値の倍数のみ許可とする。
arrayの検証
- maxItems:最大要素数。
- minItems:最小要素数。
- uniqueItems:要素がユニークであることを示すboolean値。
objectの検証
- maxProperties:最大フィールド数。
- minProperties:最小フィールド数。
詳しくは下記を参照してください。
参考
The JavaScript Object Notation (JSON) Data Interchange Format