JSONスキーマ(draft-07)への比較的新しい追加により、if、then、およびelseキーワードが追加されます。これらの新しいキーワードを正しく使用する方法がわかりません。これまでのJSONスキーマは次のとおりです。
{
"type": "object",
"properties": {
"foo": {
"type": "string"
},
"bar": {
"type": "string"
}
},
"if": {
"properties": {
"foo": {
"enum": [
"bar"
]
}
}
},
"then": {
"required": [
"bar"
]
}
}
「foo」プロパティが「bar」に等しい場合、「bar」プロパティが必要です。これは期待どおりに機能します。
ただし、「foo」プロパティが存在しないか、入力が空の場合、何も必要ありません。これを達成する方法は?
empty input {}.
見つかったエラー:
オブジェクト:barに必要なプロパティがありません。スキーマパス:#/ then/required
私はオンライン検証ツールを使用します:
if
キーワードは、値スキーマの結果が検証に合格した場合、then
スキーマを適用し、それ以外の場合はelse
スキーマを適用することを意味します。
if
スキーマで"foo"
を要求する必要があるため、スキーマが機能しませんでした。そうしないと、空のJSONインスタンスがif
スキーマの検証に合格し、したがってthen
スキーマ。"bar"
が必要です。
次に、"propertyNames":false
が必要です。これは、常に検証に失敗する"else": false
を設定する場合とは異なり、スキーマにキーが含まれないようにします。
{
"type": "object",
"properties": {
"foo": {
"type": "string"
},
"bar": {
"type": "string"
}
},
"if": {
"properties": {
"foo": {
"enum": [
"bar"
]
}
},
"required": [
"foo"
]
},
"then": {
"required": [
"bar"
]
},
"else": false
}
「else」プロパティだけを使用することはできませんか?
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": {
"enum": ["bar"]
}
}
},
"then": {
"required": ["bar"]
},
"else": {
"required": []
}
}