2017-04-12 2 views
1

아래의 json 예제에서 "Vendor"는 필수이며 일부 값 (minLength = 1)을 가져야하지만 Mode = Ground 인 경우 항상 공백으로 반환되므로 일반적인 json 스키마는 실패합니다 json 응답 아래. 모두 "모드"항상 반환됩니다, JSON 응답에서조건부 Json 스키마 - 응답 종속

{ 
    "Res": { 
    "Mem": [ 
     { 
     "Mode": "Flight", 
     "Vendor": "YP", 
     "MemNum": "222" 
     }, 
     { 
     "Mode": "Ground", 
     "Vendor": "", 
     "MemNum": "242" 
     } 
    ] 
    } 
} 

: JSON 응답은 다음과 같습니다. 지정할 수있는 사용자 정의 된 스키마를 만들 수 있습니까? "Mode"= "Ground"일 때 스키마 1로 확인하십시오. 다른 모든 경우에 대해 "모드"는 유효성 검사를 위해 schema2에서 참조를 가져옵니다.

나는 아래 시도했지만 수없는 결과를 원하는 얻을 :

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "required": [ 
    "Res" 
    ], 
    "properties": { 
    "Res": { 
     "type": "object", 
     "required": [ 
     "Mem" 
     ], 
     "properties": { 
     "Mem": { 
      "type": "array", 
      "allOf": [ 
      { 
       "$ref": "#/definitions/Flight" 
      }, 
      { 
       "$ref": "#/definitions/Ground" 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "definitions": { 
    "Flight": { 
     "properties": { 
     "Mode": { 
      "enum": [ 
      "Flight" 
      ] 
     }, 
     "VendorCode": { 
      "type": "string", 
      "minLength": 1, 
      "optional": false 
     }, 
     "MemNum": { 
      "type": "string", 
      "minLength": 1, 
      "optional": false 
     } 
     } 
    }, 
    "Ground": { 
     "properties": { 
     "Mode": { 
      "enum": [ 
      "Ground" 
      ] 
     }, 
     "VendorCode": { 
      "type": "string" 
     }, 
     "MemNum": { 
      "type": "string", 
      "minLength": 1, 
      "optional": false 
     } 
     } 
    } 
    } 
} 

원하는 결과를 달성하는 데 유용 할 수 있습니다 JSON 스키마의 다른 개념이 있습니까?

+0

코드를 올바르게 포맷하십시오. 질문에 형식이 잘못된 코드는 질문이 중요하지 않으며 잠재적 응답자에게 장애물이된다는 메시지를 보냅니다. –

+0

Tom, 포맷을 수정 해 주셔서 감사합니다! – GuruAPI

답변

0

매우 어색한 사용법이지만 "allOf", "anyOf""not"과 함께 해킹 할 수 있습니다.

스키마 :

{ 
    "oneOf" : [ 
     { 
      "allOf" : [ 
       { 
        "$ref" : "#/definitions/ModeIsGround" 
       }, 
       { 
        // schema1 comes here 
       } 
      ] 
     }, 
     { 
      "allOf" : [ 
       { 
        "not" : { 
         "$ref" : "#/definitions/ModeIsGround" 
        } 
       }, 
       { 
        // schema2 comes here 
       } 
      ] 
     } 
    ], 
    "definitions" : { 
     "ModeIsGround" : { 
      "properties" : { 
       "Mode" : { 
        "enum" : ["Ground"] 
       } 
      } 
     } 
    } 
} 

당신은 SCHEMA1 및 schema2이며, 또한 붙여 스키마가 잘못 무엇 귀하의 질문에 말하지 않았다, 그래서 단순히 SCHEMA1 및 schema2 이러한 참조, 댓글을 달았습니다.

설명 : 최상위 레벨에서 주제가 서브 스키마 중 하나와 일치해야한다고 말합니다. 첫 번째 하위 스키마는 주제가 "ModeIsGround"와 schema1과 일치해야한다고 말합니다 (이 경우는 "모드"= "접지"일 때 schema1로 검증 "이라고 설명하는 경우입니다). 두 번째 하위 스키마는 주제가 "ModeIsGround"와 일치하지 않아야하지만 schema2와 일치해야한다고 말합니다 (이것은 "다른 모든 경우"모드 "유효성 검사를 위해 schema2에서 참조 가져 오기"부분).

"oneOf"과 결합 된이 2 개의 하위 스키마는 원하는 것을 수행합니다.

"Mode"= "Ground"조건자는 단일 요소 열거 형을 통해 표현됩니다.

도움이되기를 바랍니다.