jsonschema не выдает ошибку при пропущенном обязательном свойстве - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть следующая схема:

const LIST_EVENTS = {
    "id": "/listEvents",
    "type": "object",
    "properties": {
        "filter": {
            "$ref": "/MarketFilter",
            "required": true
        },
        "locale": {
            "type": "string"
        }
    }
}

Из отладки я вижу, что объект, отправляемый на проверку:

{
    marketFilter: {
        eventTypeIds: [ '1' ],
        marketStartTime: {
            from: '2018-12-15T00:00:00+00:00',
            to: '2018-12-15T23:59:59+00:00'
        }
    }
}

marketFilter не соответствуетимя filter в схеме.Насколько я понимаю, поскольку это обязательное свойство, оно должно быть помечено в массиве errors результата проверки, но это не так.Это мой результат проверки:

ValidatorResult {
  instance:
    { marketFilter: { eventTypeIds: [Array], marketStartTime: [Object] } },
  schema:
    { id: '/listEvents',
      type: 'object',
      properties: { filter: [Object], locale: [Object] } },
  propertyPath: 'instance',
  errors: [],
  throwError: undefined,
  disableFormat: false }

Я подумал, что вполне возможно, что он не возражал против соглашения об именах, поэтому я полностью удалил свойство, и все же ошибка не регистрируется, так как это результат проверки:

ValidatorResult {
  instance: {},
  schema:
    { id: '/listEvents',
      type: 'object',
      properties: { filter: [Object], locale: [Object] } },
  propertyPath: 'instance',
  errors: [],
  throwError: undefined,
  disableFormat: false }

У меня есть много схем, и все они добавляются с помощью .addSchema метода

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

У вас есть две проблемы с вашей схемой.Основная проблема в том, что ваше ключевое слово required игнорируется, поскольку оно находится рядом с $ref.Когда объект с ключевым словом $ref встречается там, где ожидается схема, он обрабатывается только как ссылка JSON.Это не рассматривается как схема.Ссылка JSON имеет семантику только для ключевого слова $ref.Все остальное игнорируется.Вы можете решить вашу проблему, изолировав $ref в вашей схеме.

"filter": {
    "allOf": [{ "$ref": "/MarketFilter" }],
    "required": true
}

Другая проблема заключается в использовании логической формы ключевого слова required.Такое использование ключевого слова required было удалено из спецификации схемы JSON много лет назад.Если вы специально не пишете JSON Schemas против спецификации draft-03 (маловероятно, что она давно устарела), вы должны использовать массив в виде required.Некоторые старые реализации позволяют использовать обе формы, но это не очень хорошая идея.Вы должны ориентироваться на одну спецификацию и не смешивать ключевые слова из двух разных версий спецификации.

{
    "id": "/listEvents",
    "type": "object",
    "properties": {
        "filter": {
            "$ref": "/MarketFilter"
        },
        "locale": {
            "type": "string"
        }
    },
    "required": ["filter"]
}
0 голосов
/ 15 декабря 2018

На данный момент я нашел обходной путь, который также описан в документации.Я добавил в схему свойство массива required и добавил к нему filter.Теперь это выдает ошибку.

Однако в документации говорится, что свойство required в самом свойстве должно работать так же.Это потенциально проблема с пакетом или есть другое поведение, если свойство является ссылкой?

...