Атрибут jsonSchema условно зависит от родительского объекта - PullRequest
0 голосов
/ 06 июля 2018

По этому вопросу атрибут jsonschema условно обязателен , я могу применить условно обязательные свойства. Однако это может зависеть только от свойств на одном уровне объекта. В определенном случае я хочу, чтобы одно требуемое свойство зависело от его свойства родительского объекта, возможно ли это? Для приведенного ниже примера:

{
  type: 'object',
  properties: {
    { 
      os: { type: 'string', enum: ['macOs', 'windows'] },
      specs: {
        macModel: { 
          type: 'string', 
          enum: ['macbook air', 'macbook pro', 'macbook']
        },
        memory: { type: 'number' }
      }
    }
  }
}

Возможно ли выполнить это требование: / spec / macModel требуется только тогда, когда / os равно macOs ?

1 Ответ

0 голосов
/ 06 июля 2018

Да, применяется тот же подход. Вам просто нужно вложить схемы немного глубже.

{
  "type": "object",
  "properties": {
    "os": { "enum": ["macOs", "windows"] },
    "specs": {
      "macModel": { "enum": ["macbook air", "macbook pro", "macbook"] },
      "memory": { "type": "number" }
    }
  },
  "allOf": [{ "$ref": "#/definitions/os-macOs-requires-macModel" }],
  "definitions": {
    "os-macOs-requires-macModel": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/os-macOs" } },
        { "$ref": "#/definitions/requires-macModel" }
      ]
    },
    "os-macOs": {
      "properties": {
        "os": { "const": "macOs" }
      },
      "required": ["os"]
    },
    "requires-macModel": {
      "properties": {
        "specs": {
          "required": ["macModel"]
        }
      }
    }
  }
}

Обратите внимание, что в схеме /definitions/requires-macModel необходимо найти свойство "specs" и поместить туда required вместо верхнего уровня, как в плоском случае.

Я использовал шаблон следствия для этого примера, но тот же подход можно использовать с if - then, если вы предпочитаете этот подход и имеете доступ к валидатору draft-07.

...