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, 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.


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.