Azure CosmosDBでJSON Schema Validationを使ってJSON検証してみる

こんにちは、年末年始に備えて減量中の八巻です。

この記事は「ネクストスケープ クラウド事業本部 Advent Calendar 2017」の 12/13 の記事です。


イントロダクション


Azure CosmosDBのDocumentDBを使って動的に管理できるAPIを開発しており、APIのデータ(JSON)を検証するためにJSON Schemaを使用しています。JSON Schemaとは、「JSONの構造を定義したJSON」です。この記事は、JSON Schemaの記法のうちバリデーションについてまとめたものです。仕様は執筆時点のバージョン(Draft-07)に基づいています。

開発中のプログラム内では以下のライブラリを使用してバリデーションをしています。

Json.NET Schema - Newtonsoft



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が文字列であることを検証します。

{ "type":"string" }
有効なJSON
"i have a pen"
無効なJSON
11
{ "name":"Bob", "age":23 }


複数の型を有効とする例


"type"を配列とすることで複数の型を有効とすることができます。 以下の例は整数型もしくはnullを有効とします。

{ "type":["integer","null"] }


objectの検証



基本


"properties"キーワードでobject内部のフールドの検証を定義します。

以下は人物のJSONを検証するJSON Schemaです。"title"キーワードはフィールド名を表すメタ情報です。

{ "title":"人物", "type":"object", "properties":{ "name":{ "title":"名前", "type":"string" }, "age":{ "title":"年齢", "type":"integer" }, "hoby":{ "title":"趣味", "type":"string" } } }
有効なJSON
{ "name":"bob", "age":23, "hoby":"music" }

定義外のフィールドがあったり、定義したフィールドが不足していても有効です。

{ "name":"Jon", "job":"Doctor" }

次節では定義したフィールドが存在することの検証や未定義のフィールドの検証について解説します。


必須項目


"required"キーワードでobjectのフィールドの必須項目を定義することができます。

以下の例は名前と年齢を必須としています。

{ "title":"人物", "type":"object", "required":["name","age"], "properties":{ "name":{ "title":"名前", "type":"string" }, "age":{ "title":"年齢", "type":"integer" }, "hoby":{ "title":"趣味", "type":"string" } } }
有効なJSON
{ "name":"bob", "age":23 }
無効なJSON

以下の例は"age"がないため無効です。

{ "name":"bob", "hoby":"music" }


定義外のフィールドがあった場合無効とする


"additionalProperties"キワードは定義外のフィールドに対する検証です。 falseとすることで定義外のフィールドが含まれた場合に無効となります。

{ "title":"人物", "type":"object", "required":["name","age"], "properties":{ "name":{ "title":"名前", "type":"string" }, "age":{ "title":"年齢", "type":"integer" }, "hoby":{ "title":"趣味", "type":"string" } }, "additionalProperties":false }

以下は無効となります。

{ "name":"bob", "age":23, "job":"Teacher" }


定義外のフィールドに制約を定義する


"additionalProperties"キーワードは定義外のフィールドに制約を付ける場合にも使用できます。 以下は定義外のフィールドがあってもそれが文字列であれば有効とする例です。

{ "title":"人物", "type":"object", "required":["name"], "properties":{ "name":{ "title":"名前", "type":"string" } }, "additionalProperties":{ "type":"string" }, }
有効なJSON
{ "name":"bob", "hoby":"music" }
無効なJSON
{ "name":"bob", "age":23 }


配列の検証



基本


"items"キーワードで配列の要素の検証を定義します。 数値の配列であることを検証する。

{ "type":"array", "items":{ "type":"array" } }

人物オブジェクトの配列であることを検証する。

{ "type":"array", "items":{ "title":"人物", "type":"object", "properties":{ "name":{}, "age":{}, "hoby":{} } } }


配列のn番目の要素の検証を設定する。


"items"キーワードでは配列のN番目の要素について検証することが可能です。 objectの"properties"の使い方に似ています。 以下は1番目の要素は整数型で、2番めの要素は文字列型であることを検証します。

{ "title":"", "type":"array", "items":[ { "type":"integer" }, { "type":"string" } ] }
有効なJSON

要素の過不足は検証しないので以下のいずれも有効です。

[1,"Apple"]
[2]
[3,"Pineapple","Pen"]


"additionalItems"キーワードでその後の要素に制約をつけることも可能です。

 後続の要素を許可しない例

{ "title":"", "type":"array", "items":[ { "type":"integer" }, { "type":"string" } ], additionalItems:false }


後続の要素は数値のみ許可する例

{ "title":"", "type":"array", "items":[ { "type":"integer" }, { "type":"string" } ], additionalItems:{ "type":"string" } }


その他


ここまで呼んでいただければ下記の検証キーワードの使い方は想像可能だと思います。


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

JSON Schema

JSON Schema Validation


ネクストスケープ企業サイトへ

NEXTSCAPE

検索する

タグ

メタデータ

投稿のRSS