W zależności od Twojej sytuacji istnieje kilka różnych podejść. Przychodzą mi do głowy cztery różne sposoby warunkowego wymagania pola.
Zależności
Słowo dependencies
kluczowe jest warunkową odmianą required
słowa kluczowego. Foreach w dependencies
, jeśli właściwość jest obecna w walidowanym formacie JSON, schemat skojarzony z tym kluczem również musi być prawidłowy. Jeśli występuje właściwość „foo”, wymagana jest właściwość „bar”
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Istnieje również krótka forma, jeśli schemat zawiera tylko required
słowo kluczowe.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Implikacja
Jeśli twój stan zależy od wartości pola, możesz użyć logiki logicznej zwanej implikacją. „A implikuje B” faktycznie oznacza, że jeśli A jest prawdziwe, to B również musi być prawdziwe. Implikację można również wyrazić jako „! A lub B”. Właściwość „foo” nie jest równa właściwości „bar” lub właściwość „bar” jest wymagana . Lub innymi słowy: jeśli właściwość „foo” jest równa „bar”, wówczas właściwość „bar” jest wymagana
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Jeśli „foo” nie jest równe „bar”, #/anyOf/0
dopasowania i walidacja powiodły się. Jeśli „foo” równa się „bar”, #/anyOf/0
nie powiedzie się i #/anyOf/1
musi być ważne, aby anyOf
walidacja zakończyła się pomyślnie.
Enum
Jeśli warunek jest oparty na wyliczeniu, jest to trochę prostsze. „foo” może być „bar” lub „baz”. Jeśli „foo” równa się „bar”, to „bar” jest wymagany. Jeśli „foo” równa się „baz”, to „baz” jest wymagane.
{
"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"]
}
]
}
Jeśli-to-inaczej
Stosunkowo nowy dodatek do JSON Schema (projekt-07) dodaje if
, then
oraz else
słowa kluczowe. Jeśli właściwość „foo” równa się „bar”, wówczas właściwość „bar” jest wymagana
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
EDYCJA 23.12.2017: Zaktualizowano sekcję Implikacje i dodano sekcję Jeśli-to-inaczej.
EDYCJA 04.06.2018: Poprawka błędu dla Jeśli-To-Inaczej i zaktualizuj singletony enum
do użycia const
.