[jsonschema] jsonSchema 속성이 조건부 필요

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, thenelse키워드가 추가되었습니다 . “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.


답변