jsonSchema 속성이 조건부 필요


97

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필드가 필수가 아니기를 원합니다 . 이 필드의 필수 성을 조건부로 만드는 방법이 있습니까?


예, 가능해야합니다. 데이터의 어떤 정보가 의무 성을 유발합니까?
jruizaranguren

@SarveswaranMeenakshiSundaram - 내가 JSON 스키마의 사용 V4했습니다 모른다
톰 레드 펀

버전 3에서도 가능합니까?
Sarvesh

@SarveswaranMeenakshiSundaram-모르겠어요. 그것을 시도하고 알려주십시오!
톰 레드 펀

답변:


264

상황에 따라 몇 가지 다른 접근 방식이 있습니다. 조건부로 필드를 요구하는 네 가지 방법을 생각할 수 있습니다.

의존성

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.


7
@scubbo 나는 if-then-else키워드 의 팬이 아니므로 키워드 사용을 거부합니다. 그러나 그것을 사용하기로 결정했다면 항상 allOf그 세 가지 키워드 만 포함 하는로 포장하는 것이 좋습니다 . { ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
Jason Desrosiers

2
@Jason 왜 팬이 아니야 if...? 귀하의 답변에 대한 간략한 의견이 전적으로 정당하다고 생각합니다. 아니면 긴 이야기입니까?
Clay Bridges

6
@ClayBridges 댓글 섹션은 해당 토론에 적합한 장소는 아니지만 여기에 짧은 버전이 있습니다. 일반적으로 JSON 스키마 키워드는 상태 비 저장입니다. 인스턴스의 유효성을 검사하는 데 키워드 값 이외의 정보를 사용할 수 없습니다. if,, then그리고 else서로 의존하기 때문에이 규칙을 위반합니다.
Jason Desrosiers

3
@GGirard, 이것이 제가 알고있는 JSON 스키마에서 이러한 패턴을 사용하는 가장 좋은 방법입니다. 부울 연산은 공식적으로 문서화되어 있지만 나머지는 수학 일뿐입니다. allOf== AND, anyOf== OR, oneOf== XOR 및 not== NOT. 수학에 대한 더 많은 리소스 (예 : 함축)를 보려면 "부울 대수"를 검색 할 수 있습니다.
Jason Desrosiers

2
@AlexeyShrub 나는 이것에 대해 한동안 쓰고 싶었지만 다른 것들에 의해 산만 해졌습니다. 나는 조건부 아이디어 의 팬입니다 . 사람들이 더 쉽게 이해할 수 있습니다. 내 이의는 세 개의 개별 상태 저장 키워드 로 정의 된 방식에 대한 것입니다 (이전 주석 참조). 다른 키워드가 따르는 아키텍처 속성을 위반하는 키워드가 있으면 JSON 스키마 유효성 검사기가 구현하기가 더 어려워지고 효율성이 떨어집니다. 조건문이 무국적이라는 다른 방식으로 정의 되었다면 나는 이의를 제기하지 않을 것입니다.
Jason Desrosiers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.