схема json для динамических свойств, которые меняются в зависимости от типа

Я пытаюсь создать схему json, которая представляет следующий ресурс:

X resource:
{
  "type" : "{some enum of types}",
  <some list of properties that depend on the enum>
}

Вот несколько (не настоящих) примеров для иллюстрации:

{
  "type" : "car",
  "color" : "red",
  "style" : "van"
}

{
  "type" : "plane",
  "color" : "white",
  "aisle" : "double"
}

Как видите, свойство aisle применяется только тогда, когда type равно plane, а свойство style применяется только тогда, когда type равно car. Свойство color общее.

Мне удалось получить что-то вроде этого:

X schema:
{
  "$schema" : ...
  ...
  "properties" : {
    "type" : {...},
    "color" : {...}.
    "sub_properties" : {
      "type" : "object",
      "oneOf" : [ ... ]
    }
  }
}

Но это относится только к собственности sub_properties из X. То есть следующий json:

{
  "type" : "car",
  "color" : "red",
  "sub_properties" : {
    "style" : "van"
  }
}

Я не могу понять, как «поднять» oneOf, чтобы он напрямую относился к свойствам X.

Есть ли способ сделать это?


person tng    schedule 18.11.2014    source источник
comment
Пожалуйста, опубликуйте свой код и образец данных, из которых вы хотите получить желаемый результат.   -  person Mithlesh Kumar    schedule 18.11.2014
comment
Обновил вопрос.   -  person tng    schedule 18.11.2014


Ответы (1)


Из вашего текста я могу понять две разные вещи:

  • Если у вас есть перечисление и вы хотите определить типы, которые ограничивают значения перечисления, ваш единственный выбор - использовать свойство перечисления и использовать его, чтобы иметь возможность выбирать схемы по значению. как объясняется здесь.

  • Если вы просто хотите иметь альтернативные схемы для X, вы можете определить напрямую:

    "X Schema": {"oneOf": [{"id": "schema1"}, {"id": "schema2"}]}

person jruizaranguren    schedule 18.11.2014
comment
Можете привести пример, как это использовать? Означает ли это, что мне нужно определить две отдельные схемы и ссылаться на них? Я смотрю раздел 7.2 спецификации schema4, и мне не совсем понятно, как сделать это реальным. - person tng; 18.11.2014
comment
Взгляните на этот пример: stackoverflow.com/questions/26724896/ - person jruizaranguren; 19.11.2014