jsonSchema에서 required
속성을 사용하여 정의 된 필드가 필수인지 여부를 나타낼 수 있습니다 .
{
"$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"
]
}
어떤 경우에는 messageVersion
필드가 필수가 아니기를 원합니다 . 이 필드의 필수 성을 조건부로 만드는 방법이 있습니까?
답변
상황에 따라 몇 가지 다른 접근 방식이 있습니다. 조건부로 필드를 요구하는 네 가지 방법을 생각할 수 있습니다.
의존성
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"]
}
}
함축
조건이 필드의 값에 따라 달라지는 경우 implication이라는 부울 논리 개념을 사용할 수 있습니다. “A는 B를 의미한다”는 것은 A가 참이면 B도 참이어야 함을 의미합니다. 의미는 “! 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 스키마 (초안 -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"] }
}
2017 년 12 월 23 일 수정 : 암시 섹션이 업데이트되고 If-Then-Else 섹션이 추가되었습니다.
편집 2018년 6월 4일 : 버그 수정하면 – 다음 – 그밖에 및 업데이트 싱글을위한 enum
의 사용 const
.