W jsonSchema możesz wskazać, czy zdefiniowane pola są obowiązkowe, czy nie za pomocą required
atrybutu:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"header": {
"type": "object",
"properties": {
"messageName": {
"type": "string"
},
"messageVersion": {
"type": "string"
}
},
"required": [
"messageName",
"messageVersion"
]
}
},
"required": [
"header"
]
}
W niektórych przypadkach chciałbym, aby to messageVersion
pole nie było obowiązkowe. Czy istnieje sposób, aby uzależnić obowiązkowość tego pola?
jsonschema
tom redfern
źródło
źródło
Odpowiedzi:
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 wdependencies
, 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”Istnieje również krótka forma, jeśli schemat zawiera tylko
required
słowo kluczowe.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
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, abyanyOf
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.
Jeśli-to-inaczej
Stosunkowo nowy dodatek do JSON Schema (projekt-07) dodaje
if
,then
orazelse
słowa kluczowe. Jeśli właściwość „foo” równa się „bar”, wówczas właściwość „bar” jest wymaganaEDYCJA 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życiaconst
.źródło
if-then-else
słów kluczowych i odmawiam ich używania. Jeśli jednak zdecydujesz się go użyć, sugeruję zawsze umieszczanie ich w poluallOf
zawierającym tylko te trzy słowa kluczowe.{ ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
if...
? Myślę, że krótka opinia na ten temat w Twojej odpowiedzi byłaby całkowicie uzasadniona. A może to długa historia?if
,then
ielse
naruszają tę zasadę, ponieważ są od siebie zależne.allOf
== I,anyOf
== LUB,oneOf
== XOR inot
== NIE. Możesz wyszukać w Google „algebrę boolowską”, aby uzyskać więcej zasobów na temat matematyki (np. Implikacji).