jsonschema - динамические свойства со статическими свойствами

У меня есть схема для проверки json.

Для определенных свойств мне нужно, чтобы они имели значения определенных типов.

  • Если свойство "attr" равно "a", тогда свойство "val" должно быть "целым числом".
  • Если свойство "attr" равно "x", тогда свойство "val" должно быть "логическим".
  • Если свойство "attr" равно "b", то свойство "val" должно быть "строкой" в формате "ipv4".

и так далее...

Это я могу определить с помощью oneOff. Для всех других свойств "attr" мне нужно, чтобы они имели определенный формат, вроде как уловка всех, со свойством "val" быть "string".

  • Если "attr" соответствует шаблону, тогда свойство "val" должно быть "string".

это можно сделать.

Это схема, которая у меня есть на данный момент.

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "name": {
      "title": "name",
      "type": "string"
    },
    "attribute": {
      "title": "attributes",
      "type": "object",
      "$ref": "#/definitions/expr",
    }
  },
  "definitions": {
    "expr": {
      "properties": {
        "attr": {
          "title": "attribute"
        },
        "val": {
          "title": "val"
        }
      },
      "required": ["val", "attr"],
      "oneOf": [
        {
          "properties": {
            "attr": {"enum": ["a","b"]},
            "val": {"type": "integer"}
          }
        },
        {
          "properties": {
            "attr": {"enum": ["x"]},
            "val": {"type": "boolean"}
          }
        },
        {
          "properties": {
            "attr": {"pattern": "^[-A-Za-z0-9_]*$", "maxLength": 255},
            "val": {"type": "string"}
          }
        }
      ]
    }
  },
  "additionalProperties": false,
  "required": [
    "name",
    "attribute"
  ]
}

Проблема заключается в том, что свойства, для которых я пытаюсь ограничить тип значения, также соответствуют общему формату. поэтому, когда я ожидаю целочисленное значение, оно передается со строковым значением.

Например:

приведенный ниже json передаст схему на основе первого элемента oneOff

{
  "name": "shouldpass",
  "attribute": {
    "attr": "a",
    "val": 1
  }
}

нижеприведенный json пройдет на основе последнего элемента oneOff.

{
  "name": "shouldpass2",
  "attribute": {
    "attr": "h",
    "val": "asd"
  }
}

приведенный ниже json должен завершиться ошибкой на основе первого элемента oneOff, но он также проходит, потому что он соответствует последнему элементу oneOff.

{
  "name": "shouldfail",
  "attribute": {
    "attr": "a",
    "val": "string"
  }
}

как этого добиться?


person Anbarasan    schedule 28.10.2016    source источник


Ответы (1)


Ваша схема для attr в последней подсхеме может быть:

{
    "pattern": "^[-A-Za-z0-9_]*$",
    "not": { "enum": ["a", "b", "x"] },
    "maxLength": 255
}

В качестве альтернативы вместо oneOf можно использовать ключевое слово switch из следующих предложений по версии схемы JSON: http://epoberezkin.github.io/ajv/keywords.html#switch-v5-proposal

Это реализовано в Ajv (я автор).

person esp    schedule 28.10.2016