2013-08-22 1 views
20

JSON 스키마 (초안-04)에서 정의를 사용하는 방법 :내가 예를 들어 다음과 유사한 함께 일하고 나머지 서비스 응답, 나는 단지 여기에 3 개 필드를 포함했지만 더 많은있다

{ 
    "results": [ 
     { 
      "type": "Person", 
      "name": "Mr Bean", 
      "dateOfBirth": "14 Dec 1981" 
     }, 
     { 
      "type": "Company", 
      "name": "Pi", 
      "tradingName": "Pi Engineering Limited" 
     } 
    ] 
} 

내가 위 (초안-04) 명시 적를 지정합니다 이는 JSON 스키마 파일을 작성하려면 :

if type == Person then list of required properties is ["type", "name", "dateOfBirth", etc] 
OR 
if type == "Company" then list of required properties is ["type", "name", "tradingName", etc] 

그러나 그것을 수행하는 방법의 모든 문서 또는 예를 찾을 수 없습니다입니다.

현재 내 JSON 스키마는 다음과 같습니다 :

{ 
    "$schema": "http://json-schema.org/draft-04/schema", 
    "type": "object", 
    "required": ["results" ], 
    "properties": { 
     "results": { 
      "type": "array", 
      "items": { 
       "type": "object", 
       "required": ["type", "name"], 
       "properties": { 
        "type": { "type": "string" }, 
        "name": { "type": "string" }, 
        "dateOfBirth": { "type": "string" }, 
        "tradingName": { "type": "string" } 
       } 
      } 
     } 
    } 
} 

모든 포인터/I가이 문제를 처리하는 방법의 예입니다.

+0

: 그러나 http://usingjsonschema.com이 책에서 재산 및 정의 모두 종속성을 설명했다 : Type Person은 MyObject를 확장하고 Company는 MyObject를 확장하고 주 스키마는 MyObject 유형의 항목으로 배열을 정의합니다. –

+0

JSONSchema가 XSD와 얼마나 비슷한 지 모르지만 XSD에 대해 기억할 수있는 것은 공통점이 없습니다. 당신의 객체를위한 슈퍼 클래스. 당신은 schemafiles 내에서 오히려 당신의 상속 것입니다. 예 : 주 스키마의 추상 자리 표시 자로 사람 스키마와 회사 스키마를 대신 사용할 수 있습니다. – atomman

+0

의존성도 드물어요. 3. Could anyone은 드래프트 3과 4 사이의 종속성에 대한 차이점을 설명합니까? – Relequestual

답변

30

권장 접근 방식은 Json-Schema web, Example2에 표시된 것입니다. 스키마를 "값"으로 선택하려면 열거 형을 사용해야합니다.

{ 
    "type": "object", 
    "required": [ "results" ], 
    "properties": { 
     "results": { 
      "type": "array", 
      "items": { 
       "oneOf": [ 
        { "$ref": "#/definitions/person" }, 
        { "$ref": "#/definitions/company" } 
       ] 
      } 
     } 
    }, 
    "definitions": { 
     "person": { 
      "properties": { 
       "type": { "enum": [ "person" ] }, 
       "name": {"type": "string" }, 
       "dateOfBirth": {"type":"string"} 
      }, 
      "required": [ "type", "name", "dateOfBirth" ], 
      "additionalProperties": false 
     }, 
     "company": { 
      "properties": { 
       "type": { "enum": [ "company" ] }, 
       . . . 
      }   
     } 
    } 
} 
+1

results 배열 속성의 내용이 알 수없는 하위 유형 인 "Party"만 알면 oneOf 대신에 무엇을 사용할 것입니까? 관련 질문은 여기에 게시 http://stackoverflow.com/questions/19416873/how-to-tell-json-schema-validator-to-pick-schema-from-property-value :) – redben

9

죄송합니다,

내가 요점을 파악하지 : 귀하의 경우에는이 같은 것을 할 것이다. 질문은 마지막 JSON 스키마 사양의 일부인 'dependencies'키워드에 관한 것입니다. 맞습니까?

내가 허용 대답 (?)에 '종속'을 찾을 수없는이

그것은 간단히 마지막 초안에 설명되어 있습니다. (30 페이지 참조로 설명)

http://usingjsonschema.com/assets/UsingJsonSchema_20140814.pdf

29 페이지에서 시작 내가 당신이 상속이 설명해야한다고 생각

"dependencies": { 
    "shipTo":["shipAddress"], 
    "loyaltyId":["loyaltyBonus"] 
} 
+0

안녕 세바스챤, ** 의존성 사용 * * 위의 사용 사례를 달성 할 수 있습니다. [질문 - 클릭하십시오] (http://stackoverflow.com/questions/36830827/conditional-json-schema-validation-based-on-property-value). 다른 부동산의 가치에 따라 필요한 필드를 만들 수 있습니까? 링크에서 질문에 대답 할 수 있다면 좋을 것입니다. 고마워, 해리. – Harry

+0

@ 하리 정말해야하나요? "Jason"으로 물어 본 후 몇 분 후에 대답이 완벽합니다! (귀하의 질문을 참조하십시오) – sebilasse

+1

@SebastianLasse, 아마도 제목이 혼란 스럽습니다. 그러나 '명백하게 지정할 것'다음에 원래의 질문 텍스트를 읽으십시오. 그러면 답이 질문 요구 사항을 해결한다는 것을 알 수 있습니다. 질문은 json-schema'dependencies' 키워드의 사용과 관련이 없습니다. 자유롭게 제목을 개선하십시오. – jruizaranguren