Представлять 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 не так просто, как кажется, и требует поиска менее очевидных обходных путей.

Другие вопросы по тегам