NEXTSCAPE blog

株式会社ネクストスケープの社員による会社公式ブログです。ネスケラボでは、社員が日頃どのようなことに興味をもっているのか、仕事を通してどのような面白いことに取り組んでいるのかなど、会社や技術に関する情報をマイペースに紹介しています。

MENU

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

f:id:nextscape_blog:20210914221510p:plain

有効なJSON

f:id:nextscape_blog:20210914221543p:plain

無効なJSON

f:id:nextscape_blog:20210914221621p:plain

f:id:nextscape_blog:20210914221646p:plain

 


複数の型を有効とする例

 

 

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

f:id:nextscape_blog:20210914221749p:plain


objectの検証

 


基本

 

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

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

f:id:nextscape_blog:20210914221854p:plain

有効なJSON

f:id:nextscape_blog:20210914221926p:plain

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

f:id:nextscape_blog:20210914221958p:plain

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


必須項目

 

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

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

f:id:nextscape_blog:20210914222038p:plain

有効なJSON

f:id:nextscape_blog:20210914222108p:plain

無効なJSON

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

f:id:nextscape_blog:20210914222140p:plain

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

 

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

f:id:nextscape_blog:20210914222240p:plain

以下は無効となります。

f:id:nextscape_blog:20210914222306p:plain


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

 

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

f:id:nextscape_blog:20210914222339p:plain

有効なJSON

f:id:nextscape_blog:20210914222414p:plain

無効なJSON

f:id:nextscape_blog:20210914222438p:plain

配列の検証

 


基本

 

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

f:id:nextscape_blog:20210914222536p:plain

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

f:id:nextscape_blog:20210914222604p:plain


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

 

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

f:id:nextscape_blog:20210914222708p:plain

有効なJSON

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

f:id:nextscape_blog:20210914222740p:plain

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

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

f:id:nextscape_blog:20210914222811p:plain

後続の要素は数値のみ許可する例f:id:nextscape_blog:20210914222839p:plain


その他

 

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

 

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