JSON Schema の oneOf / anyOf / allOf

draft v4 の validation keyword たちであるところの xxxOf 三兄弟。
混乱しがちなのでまとめるぞ!

共通点

  • object の array であること
  • 中の object は JSON Schema として valid であること
  • array の中身は1つ以上であること

相違点

(oneOf) An instance validates successfully against this keyword if it validates successfully against exactly one schema defined by this keyword's value.


(anyOf) An instance validates successfully against this keyword if it validates successfully against at least one schema defined by this keyword's value.


(allOf) An instance validates successfully against this keyword if it validates successfully against all schemas defined by this keyword's value.

http://json-schema.org/latest/json-schema-validation.html#anchor75
oneOf

"it validates successfully against exactly one schema"
array のうち、かならずひとつの schema に合致することが条件です。
anyOf と違い、array 中のふたつ以上の schema に合致してしまうと fail します。

anyOf

"it validates successfully against at least one schema"
array のうち、ひとつ以上の schema に合致することが条件です。

allOf

"it validates successfully against all schemas"
array の中身すべての schema に合致することが条件です。

特に oneOf と anyOf の違いが仕様を読んでもぱっと頭に入ってこなかったので、実際に実装までたどってナルホドしました…