2017-01-09 11 views
2

Обертывание головы вокруг модели JSON Schema oneOf.Представляем xs: выбор как схема JSON

Я хочу создать версию JSON формата XML и иметь схему JSON, подтверждающую основные аспекты (я знаю, что будут некоторые отличия).

У меня есть понятие XML-схемы, где можно указать имя или идентификатор для некоторого объекта:

<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> 

В соответствующей схеме JSON У меня возникли проблемы с , где поставить oneOf объект.

В 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 размещаются на краях дерева.

Это становится apparant в XML-схеме и в схеме JSON, особенно с вашим примером. XML-схема с xs:choice обеспечивает выбор между возможными элементами (узлами в модели данных набора данных XML), и поскольку эти элементы несут свои имена с ними (метки на узлах), вы также можете выбрать эти имена элементов вместе со своими макеты.

Однако в JSON Schema, то oneOf конструкция позволяет выбрать макет объекта, но это делает не включать сбор название (этикетки) по краям. Другими словами, ключ (EntityID или EntityName) указан за пределами конструкции oneOf. Это означает, что отображение на oneOf не так прямолинейно, как кажется, и для этого требуется найти менее очевидные обходные пути.

Смежные вопросы