状況に応じて、いくつかの異なるアプローチがあります。フィールドを条件付きで要求するには、4つの異なる方法が考えられます。
依存関係
dependenciesキーワードは、条件付きのバリエーションであるrequiredキーワード。のForeachプロパティ。プロパティdependenciesが検証されるJSONに存在する場合、そのキーに関連付けられたスキーマも有効である必要があります。 「foo」プロパティが存在する場合、「bar」プロパティは必須です
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
スキーマにrequiredキーワードのみが含まれている場合は、短い形式もあります。
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
含意
条件がフィールドの値に依存する場合、含意と呼ばれるブール論理の概念を使用できます。「AはBを意味する」とは、Aがtrueの場合、Bもtrueでなければならないことを意味します。含意は「!AまたはB」として表すこともできます。 「foo」プロパティが「bar」と等しくないか、「bar」プロパティが必要です。または、言い換えると、「foo」プロパティが「bar」と等しい場合、「bar」プロパティは必須です。
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
「foo」が「bar」と等しくない場合、#/anyOf/0一致と検証は成功します。「foo」が「bar」と等しい場合、#/anyOf/0失敗#/anyOf/1し、anyOf検証が成功するには有効でなければなりません。
列挙型
条件が列挙型に基づいている場合、それはもう少し簡単です。 「foo」は「bar」または「baz」のいずれかです。「foo」が「bar」と等しい場合、「bar」が必要です。「foo」が「baz」と等しい場合、「baz」が必要です。
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
If-Then-Else
JSONスキーマ(draft-07)への比較的新しい追加によりif、thenおよびelseキーワードが追加されました。 「foo」プロパティが「bar」と等しい場合、「bar」プロパティは必須です
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
編集12/23/2017:含意セクションが更新され、If-Then-Elseセクションが追加されました。
EDIT 2018年6月4日:バグ修正されたIf-Then-Elseおよび更新シングルトンのためのenumsが使用しますconst。