json
サンプルとなるJSONデータはこんな感じ。
JSONデータからJSONschema.Netでスキーマを生成する。このスキーマはJSONデータの構造をそのままなぞった構造になっている。
JSON Schema validation onlineにおいてこのJSONデータをこのJSONスキーマにより検証してみると確かに成功する。$id
とかexamples
などがunknownとかignoredとなっているのが気になる。
JSONスキーマ自体もJSONであるから検証可能である。JSON Schema Validatorには有名どころのJSONスキーマがいくつか登録されており、その中にはJSONスキーマ自体のJSONスキーマも登録されている。生成されたJSONスキーマを検証すると成功する。ただしこれをもって正しく機能するJSONスキーマであるということはできない。例えば$ref
で参照する先が無かったとしてもそのような誤りの有無は検証できない。
JSONスキーマのJSONスキーマを見るとdefinitions
が宣言されている。definitions
の代わりにaiueo
と書いたとしてもそれが$ref
で正しく参照されていればそのJSONスキーマを使って検証ができるのだが、やはりdefinitions
を使うのが正しいようだ。このような点を厳しく検証したいならば、JSONスキーマのJSONスキーマにあえて "additionalProperties":false
を指定すれば検証においてエラーとなる。
オブジェクトが持つべき必須のプロパティはrequired
で宣言する。自動的に作成されたJSONスキーマにもあるので特にこれ以上は書かない。
"type"="object"
とすればそのプロパティの取りうる値をオブジェクトに限定することを宣言する。"type"=["object","null","boolean"]
などとすることもできる。JavaScriptと異なり、nullはオブジェクトではない。
追加可能なプロパティを宣言するためにはadditionalProperties
を使う。"additionalProperties"=false
すればJSONスキーマで宣言しなかったプロパティを禁止することになる。
$ref
JSONスキーマの階層が深すぎるので、いくつかの宣言をJSONスキーマのルート直下のdefinitions
プロパティ以下に移動し$ref
で参照する。
bookmarks
がとる値はオブジェクトのリストと宣言されているが、この宣言もbookmark
として分離できる。
$ref
を使ったJSONスキーマでも検証に成功する。
$ref
による参照JSONスキーマが長くて読みにくいので、definitions
をgistに移動した。参照先にはdefinitions
以外のプロパティが無いのでルートに移動した。これに伴い相対URLであった$ref
を絶対URLに変更した。URLはgistのraw URLを使った。
{
"definitions": {
"url": {
"type": ["string", "null"]
},
"title": {
"type": ["string", "null"]
},
"description": {
"type": ["string", "null"]
},
"datetime": {
"type": ["string", "null"]
},
"bookmark": {
"type": "object",
"required": ["url", "title", "description", "datetime"],
"properties": {
"url": {
"$ref": "#/definitions/url"
},
"title": {
"$ref": "#/definitions/title"
},
"description": {
"$ref": "#/definitions/description"
},
"datetime": {
"$ref": "#/definitions/datetime"
}
},
"additionalProperties": false
}
}
}
{}
という空のJSONスキーマも立派(?)なJSONスキーマである。どんなJSONデータを検証しても成功する。