2017-11-23 15 views
1

"깨진 참조"의 사례를 찾기 위해 JSON 스키마를 사용하여 JSON 파일의 유효성을 검사하려고합니다. 기본적으로 내 파일이 각 항목과 같이, 그룹의 속성 키가 참조 하나의 그룹에 속하는 항목 및 그룹 구성개체 속성 키를 JSON 스키마의 열거 형으로 사용

{ 
    "items": { 
     "banana": { 
      "name": "Banana", 
      "group": "fruits" 
     }, 
     "apple": { 
      "name": "Apple", 
      "group": "fruits" 
     }, 
     "carrot": { 
      "name": "Carrot", 
      "group": "vegetables" 
     }, 
     "potato": { 
      "name": "Potato", 
      "group": "vegetables" 
     }, 
     "cheese": { 
      "name": "Cheese", 
      "group": "dairy" 
     } 
    }, 
    "groups": { 
     "fruits": { 
      "name": "Fruits" 
     }, 
     "vegetables": { 
      "name": "Vegetables" 
     } 
    } 
} 

을 예에서 항목 cheese 이상은 있기 때문에, 유효하지 않은 것으로 간주되어야한다 groups 개체의 no dairy 속성 나는이 다음 스키마 사용하여 유효성을 시도했다 : 이것은 group에 대한 enumgroups에서 속성 값으로 채워집니다 효과가있다

{ 
    "$schema": "http://json-schema.org/draft-06/schema#", 
    "title": "Food", 
    "id": "food", 
    "type": "object", 
    "properties": { 
     "items": { 
      "type": "object", 
      "patternProperties": { 
       "^[A-Za-z0-9-_.:=]+$": { 
        "properties": { 
         "name": { 
          "type": "string", 
          "pattern": "^[A-Za-z- ]+$" 
         }, 
         "group": { 
          "pattern": "^[a-z]+$", 
          "enum": { 
           "$data": "/groups" 
          } 
         } 
        } 
       } 
      } 
     }, 
     "groups": { 
      "type": "object", 
      "patternProperties": { 
       "^[A-Za-z0-9-_]+$": { 
        "properties": { 
         "name": { 
          "type": "string", 
          "pattern": "^[A-Za-z- ]+$" 
         } 
        } 
       } 
      } 
     } 
    }, 
    "additionalProperties": false 
} 

,하지만 내가하고 싶은 것은 재산을 를 사용하다 groups에 정의되어 있습니다.

예를 들면 다음과 같은 속성을 추가하면 groupIds 그리고 그것이 groups에있는 모든 속성 키의 배열이고 enum을 "$data": "/groupIds"으로 지정하면 JSON 포인터 문제가됩니다.

키워드의 값은 배열해야로서

JSON 스키마에 enum 키워드

정의된다. 이 배열은 최소한 하나의 요소를 가져야한다 (SHOULD). 배열의 요소는 고유해야합니다 (SHOULD).

그래서 개체 값을 참조하는 대신 JSON 포인터 만 가져올 수 있다면 enum 유효성 검사가 작동하는 것 같습니다. 나는 "$data": "/groups/.keys", "$data": "/groups/$keys" 또는 그와 비슷한 것을 생각하고 있지만 검색 중이거나 사양을 읽는 동안 찾지 못했습니다. 그런 것이 있습니까? 아니면 지금까지 제안 된 적이 있습니까?

답변

2

그런 것은 없습니다. JSON 내부의 일반적인 표현식과 매우 유사하며 일부 유스 케이스가있을 수 있지만 그러한 지정은 없습니다.