状況に応じて、いくつかの異なるアプローチがあります。フィールドを条件付きで要求するには、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および更新シングルトンのためのenum
sが使用しますconst
。