Как определить схему JSON, которая требует, чтобы массив объектов содержал как минимум 2 свойства определенного значения?

1

У меня есть набор данных, который выглядит так:

Действительные данные примера

{
  type: "step",
  label: "Step 1",
  fields: [
    // An optional field
    {
      type: "email",
      label: "Your Email"
    },
    // A field that is required and can be either amount|preset
    {
      type: "amount",
      label: "Amount"
    },
    // A field that is required and can be either credit_card|ach
    {
      type: "credit_card",
      label: "Credit Card"
    }
  ]
}

Массив fields может содержать множество объектов различных типов. Вышеприведенный пример будет действительным.

Недопустимые данные примера

{
  type: "step",
  label: "Step 1",
  fields: [
    {
      type: "email",
      label: "Your Email"
    },
    {
      type: "credit_card",
      label: "Credit Card"
    }
  ]
}

Это должно ошибка, поскольку не включает в себя объект типа amount или presets

Правила валидации

Чтобы быть действительными, fields должны содержать 2 объекта.

  • 1 из них должен быть либо { type: "amount" } либо { type: "presets" }

  • 1 из них должен быть либо { type: "credit_card" } либо { type: "ach" }

  • Любая комбинация из 2 сделает fields действительными.

Схема JSON

Вот моя (неудачная) схема JSON:

{
  "title": "step",
  "type": "object",
  "properties": {
    "type": {
      "title": "type",
      "type": "string"
    },
    "label": {
      "title": "label",
      "type": "string"
    },
    "fields": {
      "title": "fields",
      "description": "Array of fields",
      "type": "array",
      "additionalItems": true,
      "minItems": 1,
      "items": {
        "type": "object",
        "anyOf": [
          { "properties": { "type": { "enum": ["amount", "preset"] } } },
          { "properties": { "type": { "enum": ["credit_card", "ach"] } } }
        ],
        "properties": {
          "type": {
            "type": "string",
          }
        }
      },
    }
  },
  "required": ["type", "label", "fields"]
}

Вот ссылка на JSON Schema Validation Reference

Я думаю, что между contains, anyOf, allOf, oneOf и enum я должен быть в состоянии сделать это?

Теги:
validation
jsonschema

1 ответ

1
Лучший ответ

Поместите в схему /properties/fields. Это выражает те ограничения, которые вам нужны. Удалить /properties/fields/items/anyOf (это неправильно) и /properties/fields/additionalItems /properties/fields/items/anyOf (он ничего не делает).

"allOf": [
  {
    "contains": {
      "properties": { "type": { "enum": ["amount", "presets"] } }
    }
  },
  {
    "contains": {
      "properties": { "type": { "enum": ["credit_card", "ach"] } }
    }
  }
]
  • 0
    Спасибо. Также следует отметить, что contains было реализовано только в версии 6, и некоторые библиотеки валидаторов могут не поддерживать его. В этом случае потребовался переход от jsonschema к ajv npm libs.
  • 0
    @elzi Да, я использовал это, потому что это было упомянуто в вопросе. Можно выразить contains ограничение без проекта-06, но это другой вопрос :-)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню