programing

배열의 항목 속성이 Json Schema에서 고유함을 확인하시겠습니까?

muds 2023. 3. 7. 22:10
반응형

배열의 항목 속성이 Json Schema에서 고유함을 확인하시겠습니까?

다음 JSON 스키마를 지정하면 "name" 속성이 고유해야 한다는 것을 나타낼 수 있습니까(즉, "elements" 배열에 동일한 "name"을 가진 항목이 두 개 있으면 안 됩니다).

{
  "root": {
    "type": "object",
    "properties": {
      "elements": {
        "type": "array",
        "minItems": 1,
        "items": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "title": "Element Name",
              "minLength": 3,
            },
            "url": {
              "type": "string",
              "title": "Some URL"
            }
          }
        }
      }
    }
  }
}

unique Items 키워드를 사용하려고 했는데 단순한 값 목록을 위해 설계된 것 같습니다.

아니, 그건 불가능해.문서에서 json-schema:...JSON 데이터 구조를 정의하기 위한 JSON 기반 형식입니다.

이는 표준의 목적이 아니기 때문에 데이터 값 검증에는 상당히 제한적입니다."고유한 ID" 기능을 요청하는 것이 일반적이기 때문에 많은 사람들이 이전에 이것을 물어본 적이 있습니다.유감스럽게도 필요한 사람에게는 json-schema에서는 제공되지 않습니다.

따라서 고유성을 보장하려면 속성 값 대신 "이름"을 속성 키로 사용하는 것이 유일한 옵션입니다.

데이터 구조를 리팩터링하는 것이 옵션인 경우 다음과 같은 접근방식이 도움이 될 수 있습니다.

  • 어레이를 맵으로 바꿉니다.이것은, 다음과 같은 오브젝트를 사용하는 것으로 간단하게 달성할 수 있습니다.patternProperties패턴은 정규 표현입니다.패턴과 일치하는 오브젝트는 모두 패턴속성의 스키마에 대해 검증됩니다.임의의 문자열 >= 3 문자와 일치하는 패턴은 다음과 같습니다."....*"하지만 미행자가 있는 것 같아요".*"항상 함축되어 있기 때문에"..."동작합니다.
  • additional Properties: false는 제약조건을 적용하기 위한 추가 절차입니다(minLength:3).
  • 맵에서 하나 이상의 요소를 적용하려면(사용 중)minItems:1어레이의 경우)를 교환합니다.minItems타고minProperties.

...다음 스키마가 생성됩니다.

"root": {
  "type": "object", 
  "properties": {
    "elements": {
      "type": "object", 
      "patternProperties": {
        "...": {
          "type": "object", 
          "properties": {
            "url": {
              "type": "string"
            }
          }
        }
      }, 
      "additionalProperties": false, 
      "minProperties": 1
    }
  }
}

다음과 같은 문서(제외)가 이전 스키마와 일치하는 경우,

"elements": [
  {
    "name": "abc", 
    "url": "http://myurl1"
  }, 
  {
    "name": "def", 
    "url": "http://myurl2"
  }, 
  {
    "name": "ghij", 
    "url": "http://myurlx"
  }
]

... 이와 같은 문서(해당)는 새 스키마와 일치합니다.

"elements": {
  "abc": {
    "url": "http://myurl1"
  }, 
  "def": {
    "url": "http://myurl2"
  }, 
  "ghij": {
    "url": "http://myurlx"
  }
}

Ajv 검증자의 경우 사용자 지정 JSON-Schema 키워드 uniqueItemProperties: ajv-validator/ajv-keywords를 사용할 수 있습니다.

사용 사례에서 추가된 오버헤드를 처리할 수 있는 경우, 문서에 변환을 적용하여 축소된 문서를 생성한 후 축소된 문서에 별도의 미니 스키마를 사용하여 검증을 다시 적용할 수 있습니다.

다음은 Json 변환 툴에 대한 정보가 포함된 링크입니다.

JSONata에서는 예시를 다루는 것이 매우 간단합니다.

언급URL : https://stackoverflow.com/questions/24763759/make-sure-item-property-in-array-is-unique-in-json-schema

반응형