2017-12-22 17 views
0

저는 JSON 스키마를 사용하고 있으며 올바르게 설계했는지, 어떤 제안 사항이 있는지 잘 모르겠습니다.JSON 스키마 유효성 검사를 위해 하위 스키마에서 상위 스키마 참조하기

그래서 "Data.json"이라는 내부 개체를 참조하는 "Task.json"이라는 부모 개체가 있습니다. 이제 "Data.json"의 필수 속성이 "Task.json"의 속성에 따라 달라 지도록 스키마의 유효성을 검사 할 수있는 방법이 필요합니다. 예를 들어, Task.json에 "action = create"가 포함되어 있으면 "action = update"는 "a", "d"는 data.json의 속성을 "a", "b"또는 "c" , "e". "action"매개 변수에 따라 유효한 속성을 지정할 수 있도록 data.json의 부모 개체 (작업)를 어떻게 참조 할 수 있는지 잘 모르겠습니다. 예

:

Task.json

{ 
    "oneOf":[ 
     { 
     "action":"create", 
     "data":"data.json" 
     }, 
     { 
     "action":"update", 
     "data":"data.json" 
     } 
    ] 
} 

Data.json

 { 
    "properties":{ 
     "a":{ 

     }, 
     "b":{ 

     }, 
     "d":{ 

     }, 
     "e":{ 

     } 
    }, 
    "oneOf":[ 
     { 
     "#/action":{ 
      "enum":[ 
       "create" 
      ] 
     }, 
     "required":[ 
      "a", 
      "b", 
      "c" 
     ] 
     }, 
     { 
     "#/action":{ 
      "enum":[ 
       "update" 
      ] 
     }, 
     "required":[ 
      "a", 
      "d", 
      "e" 
     ] 
     } 
    ] 
} 

답변

0

사용자는와 서브 스키마를 참조 10 키워드. 귀하의 소송은 표현하기가 조금 복잡하지만 분명히 할 수 있습니다. 유스 케이스의 세부 사항에 따라이 방법을 단순화 할 수 있습니다. 나는 여기서 가장 유연한 디자인을 보여주고 있습니다.

{ 
    "type": "object", 
    "properties": { 
    "action": { "enum": ["create", "update", "delete"] }, 
    "data": { 
     "type": "object", 
     "properties": { 
     "a": {}, 
     "b": {}, 
     "d": {}, 
     "e": {} 
     } 
    } 
    }, 
    "allOf": [ 
    { "$ref": "#/definitions/action-create-implies-abc" }, 
    { "$ref": "#/definitions/action-update-implies-ade" } 
    ], 
    "definitions": { 
    "action-create-implies-abc": { 
     "anyOf": [ 
     { "not": { "$ref": "#/definitions/action-create" } }, 
     { 
      "properties": { 
      "data": { "required": ["a", "b", "c"] } 
      }, 
      "required": ["data"] 
     } 
     ] 
    }, 
    "action-update-implies-ade": { 
     "anyOf": [ 
     { "not": { "$ref": "#/definitions/action-update" } }, 
     { 
      "properties": { 
      "data": { "required": ["a", "d", "e"] } 
      }, 
      "required": ["data"] 
     } 
     ] 
    }, 
    "action-create": { 
     "properties": { 
     "action": { "enum": ["create"] } 
     }, 
     "required": ["action"] 
    }, 
    "action-update": { 
     "properties": { 
     "action": { "enum": ["update"] } 
     }, 
     "required": ["action"] 
    } 
    } 
} 
+0

그래서 위의 스키마를 검증하고 "정의"의 "특성"내부의 "필수"항목을 무시하는 것으로 보입니다. 테스트 목적으로 "required"를 "enum"으로 업데이트 한 다음 anyOf의 "properties"내부에서 유효성을 검사하는 것으로 보입니다. '필수'가 정의/속성 내부에서 작동하지 않는 것 같습니다. – user5879804

+0

나는 당신이 무슨 말하려고하는지 확신하지 못합니다. 하지만이 소리는 별개의 질문 일 수 있습니까? 내게 가장 좋은 방법은 새로운 질문을하는 것입니다. – Jason

0

제이슨 감사합니다! 당신의 예는 훌륭하고 원래 디자인을 다시 생각하게 만듭니다.

그래서 Data.json 안에 "MetaData.json"이 있고 여기에 "Data.json"과 "a", "b"및 "c"가 필요한 다른 레이어가 추가되었습니다. "Metadata.json"은 필요에 따라 "a", "d"및 "e"가있는 "Metadata.json"만 필요합니다. 이 경우 data.metadata의 필수 속성이 "a", "b"및 "c"라는 정의/속성 내부를 나타내는 방법이 있습니까?이 디자인은 "업데이트"작업에 필요할 수있는 유스 케이스를 따릅니다. "metadata.json"는 전달되는 실시 예

:.

Data.json

{ 
    "properties":{ 
     "x":{ 

     }, 
     "y":{ 

     }, 
     "z":{ 

     }, 
"metadata": { 
     $ref: "metadata.json" 
} 
    } 

metadata.json

{ 
    "properties":{ 
     "a":{ 

     }, 
     "b":{ 

     }, 
     "d":{ 

     }, 
     "e":{ 

     } 
}