Представлять xs: выбор как схему JSON
Оборачиваю голову вокруг JSON Schema's oneOf
,
Я хочу создать версию XML в формате JSON и иметь схему 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
объект.
В примерах схемы JSON похоже, что вы должны поместить полные схемы в oneOf
, это правильно? Как это должно выглядеть в общем случае? Кто-нибудь задокументировал сходства и различия между схемами XSD и JSON для справки?
2 ответа
Я не пробовал сам, но я думаю, что вам нужно что-то вроде этого:
{
"allOf" : [
{
"type" : "object",
"properties" : {
"entityName" : {"type" : "string"},
"entityID" : {"type" : "integer"}
}
},
{
"oneOf" : [
{
"required" : ["entityName"]
},
{
"required" : ["entityID"]
}
]
}
]
}
Так что после под верхнего уровня "allOf"
вы сначала опишите основную структуру, а затем "oneOf"
Вы выражаете свой выбор.
Я думаю, что проблема, с которой вы сталкиваетесь, - это небольшое несоответствие импеданса между моделями данных XML и JSON.
Хотя оба они основаны на деревьях, метки элементов XML или ключей JSON не размещаются в одних и тех же местах деревьев: с логической точки зрения имена элементов XML размещаются на узлах дерева, а ключи JSON - на края дерева.
Это становится очевидным в схеме XML и в схеме JSON, особенно в вашем примере. XML-схема, с xs:choice
, предоставляет выбор между возможными элементами (узлами в модели данных набора информации XML), и, поскольку эти элементы имеют свои имена (метки на узлах), вы можете выбрать имена этих элементов вместе с их макетами.
Однако в схеме JSON oneOf
Конструкция позволяет выбрать макет объекта, но это не включает в себя выбор имени (метки по краям). Другими словами, ключ (EntityID или EntityName) указывается вне oneOf
построить. Это означает, что отображение xs:choice
в oneOf
не так просто, как кажется, и требует поиска менее очевидных обходных путей.