2017-01-09 15 views
2

JSON 스키마의 oneOf 주위에 머리를 감싸고 있습니다.xs : choice를 JSON 스키마로 표현하십시오.

XML 형식의 JSON 버전을 생성하고 JSON 스키마에서 필수적인 측면을 검증해야합니다 (몇 가지 차이점이 있음을 알고 있습니다).

<xs:element name="Entity" type="test:EntityType" /> 
    <xs:complexType name="EntityType"> 
     <xs:choice> 
      <xs:element name="EntityID" /> 
      <xs:element name="EntityName" /> 
     </xs:choice> 
    </xs:complexType> 

나는 oneOf 객체를 넣어 에 문제가있어 해당 JSON 스키마에서 :

나는 당신이 어떤 개체의 이름 또는 ID를 지정할 수있는 XML 스키마 개념이있다.

the JSON schema examples에서 완전한 스키마를 oneOf에 넣어야하는 것 같습니다. 맞습니까? 일반적인 경우에 어떻게 보이나요? 누구도 XSD와 JSON 스키마 사이의 유사점과 차이점을 참고로 문서화 했습니까?

답변

4

내가 직접 시도하지 않은,하지만 난 당신이 같은 필요가 있다고 생각 :

{ 
    "allOf" : [ 
     { 
      "type" : "object", 
      "properties" : { 
       "entityName" : {"type" : "string"}, 
       "entityID" : {"type" : "integer"} 
      } 
     }, 
     { 
      "oneOf" : [ 
       { 
        "required" : ["entityName"] 
       }, 
       { 
        "required" : ["entityID"] 
       } 
      ] 
     } 
    ] 
} 

그래서 후 최상위에서 먼저 기본 구조를 설명 "allOf", 다음 "oneOf" 당신이 표현을 선택.

+0

좋아, 그건 꽤 정신이 나간다. 따라서 사용 가능한 카디널리티는 포킹 로직 내부에 숨겨져 있습니다. 좋은. 그것을 시도하자. 그리고 등급으로 돌아 올께. – Michael

+1

고마워요 @erosb - 테스트되지 않은 답변 때문에이 기능이 정말 잘 작동했습니다! – Michael

2

내가 직면 한 문제는 XML과 JSON 데이터 모델간에 작은 임피던스 불일치라고 생각합니다. 모두가 나무를 기반으로하지만, XML 요소 또는 JSON 키의 레이블이 나무 같은 장소에 배치되지 않은

는 : 논리적 인 관점에서, XML 요소 이름은 트리의 노드에 배치 JSON 키는 가장자리 인에 배치됩니다.

이것은 XML 스키마와 JSON 스키마에서 특히 귀하의 예와 함께 apparant됩니다. xs:choice이있는 XML 스키마는 가능한 요소 (XML 정보 세트 데이터 모델의 노드) 사이에서 선택 사항을 제공하며이 요소는 이름 (노드의 레이블)을 가지고 있기 때문에 이러한 요소 이름도 함께 선택하게됩니다. 레이아웃.

그러나 JSON 스키마에서는 oneOf 구문을 사용하여 개체 레이아웃을 선택할 수 있지만 이 아닌에는 이름 (가장자리에 레이블)이 포함됩니다. 즉, 키 (EntityID 또는 EntityName)는 외부oneOf 구조로 지정됩니다. 즉, xs:choice에서 oneOf으로의 매핑이 그다지 직설적이지 않으며 덜 분명한 해결 방법을 찾아야합니다.