2017-02-24 2 views
2

일부 값의 유효성을 검사하기 위해 JSON 스키마를 사용하고 싶습니다. 나는 두 객체를 trackedItems 및 trackedItemGroups라고 부릅니다. trackedItemGroups는 그룹 이름과 trackedItems 이름 목록입니다. 나는 TrackedItemGroupsTrackedItems 배열의 모든 문자열이 TrackedItems.TrackedItemName에 정의되어있어 이름임을 확인하고 싶습니다JSON 값을 다른 JSON 객체의 이름으로 제한하십시오.

"TrackedItems": { 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "TrackedItemName": { "type": "string" }, 
     "Properties": { ---- } 
    } 
    } 
}, 
"TrackedItemGroups": { 
    "type": "array", 
    "items": { 
    "type": "object", 
    "properties": { 
     "GroupName": { 
     "type": "string" 
     }, 
    "TrackedItems": { 
     "type": "array", 
     "items": {"type": "string"} 
     } 
    } 
    } 
} 

예를 들어, 스키마는 유사하다.

이 값은 enum 속성을 사용하여 값을 제한하는 것과 같지만 enum 목록은 TrackedITems.TrackedItemName의 값을 기반으로 생성됩니다.

유효성 검사를 위해 JSON 자체 데이터를 사용하도록 스키마를 작성하려면 어떻게해야합니까?

TrackedItems는 자신이 속한 그룹을 정의하지만, 추적 된 항목이 수백 개 있으며이 조직이 내 유스 케이스에 대해 더 잘 작동한다는 것을 알고 있습니다.

나는이 시도했다 :

"TrackedItems": { 
    "type": "array", 
    "items": { 
     "oneOf": [ 
      {"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"} 
     ] 
    } 
} 

을하지만이 오류가 발생합니다 데이터 예를 들어

Newtonsoft.Json.Schema.JSchemaReaderException: Could not resolve schema reference '#/properties/TrackedItems/items/properties/TrackedItemName'.

, 나는 TrackedItems가 있다면 :

항목 1, 항목 2, 항목 A, 항목 B, 항목 C

및 그룹 :

그룹 1 : 항목 1, ItemB, ItemC

그룹 2 : 항목 1, 항목 2, ItemZ

이 항목이 TrackedItems에 정의되지 않은이 포함되어 있기 때문에 그룹 2는 위반을 던질 것입니다.

답변

1

어휘가 검증 (사소한 주장에 의해 기술 된 어떤 다른 것들)에 대한 JSON 스키마는 데이터의 일관성을 확인 할 수있는 방법을 제공하지 않습니다된다.

유효성 검사는 "X가 문자열인지 확인"과 같은 어설 션을 의미합니다.

"일관성이란"X가 기존 활성 사용자의 ID인지 확인하는 것과 같은 의미입니다.

비교할 데이터가 다른 데이터베이스에 모두있을 수 있으며 이러한 종류의 어설 션이 중요하지 않으므로 JSON 스키마는 응용 프로그램 및/또는 다른 기술까지 데이터의 일관성을 확인합니다. 일부 구현에는 문서 내 비교를위한 공급 업체별 확장이 있지만 이러한 표준은 표준화되지 않았으므로 여기서는 작동하는 것을 인식하지 못합니다. 그것을 참조하여 다른 스키마에 대체 할 단지 방법으로


$ref 참조, 여기에 작동하지 않습니다.

{ "oneOf": [ 
    {"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"} 
] } 

말과 정확히 같은 일이다 : 당신이 참조가 작동하도록 관리 할 수 ​​있다면,이 스키마 (및 오류를 가지고 이유를 잘 모르겠어요, 이것은 구현의 구체적 세부 사항입니다)

{ "oneOf": [ 
    {"type": "string"} 
] } 

은 "다음 한 문장의 하나에 해당하는 확인"요구하고 있기 때문에, 이것은 단순히으로도 동일합니다

{"type": "string"} 

JSON 스키마를 사용하여 JSON의 데이터간에 관계를 선언 할 수는 없지만 JSON 스키마는 URI 및 하이퍼 링크를 사용하는 것에 대해 다소 의구심을 나타냅니다.

+0

감사합니다. 더 많은 조사를 한 후에 스키마가이 작업을 수행하지 않는다는 것을 알았습니다. 대신 코드에서이 유효성 검사를 수행하기위한 단위 테스트를 만들었습니다. 귀하의 답변에 감사드립니다. – MichaelHouse