Json.NET IsValid с передачей схемы, даже если она не соответствует

У меня есть схема json в draft-03. Одно из свойств в нем такое -

"KeyToCheck": {
      "type": "array",
      "items": {
        "type": "object",
        "required": "true",
        "properties": {
          "property1": {
            "type": "string",
            "required": "true"
          },
          "property2": {
            "type": "string",
            "required": "true"
          },
          "property3": {
            "type": "number",
            "required": "true"
          },
          "property4": { "type": "array" }
        }
      },
      "required": "true"
    }

Я применил required - true для KeyToCheck (нижний наиболее требуемый - true в приведенном выше json. Однако метод IsValid все еще проходит, даже если массив KeyToCheck становится пустым в Response. Метод используется таким образом - Jtoken.parse (ответ) .isvalid(схема).


person GameFromScratch    schedule 01.08.2019    source источник


Ответы (1)


Проблема в том, что в вашей схеме JSON вы не проверяете длину массива KeyToCheck. Вы можете использовать свойство minItems для установки нижней границы массива. Попробуйте использовать схему JSON. Надеюсь, это сработает.

{
  "$schema": "http://json-schema.org/draft-03/schema#",
  "type": "object",
  "properties": {
    "KeyToCheck": {
      "type": "array",
      "required": true,
      "minItems": 1,
      "items": {
        "type": "object",
        "required": true,
        "properties": {
          "property1": {
            "type": "string",
            "required": true
          },
          "property2": {
            "type": "string",
            "required": true
          },
          "property3": {
            "type": "number",
            "required": true
          },
          "property4": {
            "type": "array"
          }
        }
      }
    }
  }
}

Введите JSON:

{
 "KeyToCheck":[]
}

Результат проверки:

Сообщение: Количество элементов массива 0 меньше минимального количества 1. Путь схемы: #/properties/KeyToCheck/minItems

Изменить:

Для проверки непустого массива используйте эту схему

{
  "$schema": "http://json-schema.org/draft-03/schema#",
  "type": "object",
  "properties": {
    "KeyToCheck": {
      "type": "array",
      "required": true,
      "maxItems": 0
    }
  }
}

Введите JSON:

{
 "KeyToCheck":["test_value"]
}

Результат проверки:

Сообщение: Количество элементов массива 1 превышает максимальное количество 0. Путь схемы: #/properties/KeyToCheck/maxItems

person lahiruk    schedule 07.08.2019
comment
в моем случае проблема в том, что массив KeyToCheck должен быть пустым. но тот факт, что требуется true, не терпит неудачу, это проблема. Должен ли я использовать maxItems:0 для этого? Чтобы убедиться, что в массиве KeyToCheck нет элементов? - person GameFromScratch; 08.08.2019
comment
Я немного смущен вашим требованием сейчас. Вы хотите пройти проверку, когда массив KeyToCheck пуст? Кроме того, ключевое слово required не имеет ничего общего с размером массива. Он проверяет только доступность поля JSON и завершается ошибкой только в том случае, если поле KeyToCheck недоступно во входных данных JSON. - person lahiruk; 08.08.2019
comment
поэтому я хочу, чтобы в этом конкретном ответе массив KeyToCheck был пустым. Итак, я просто однажды случайно проверил, что require:true не сработает, но это не так. что меня беспокоило. Я думал, что required:true проверит наличие хотя бы одного объекта в массиве. Итак, чтобы переформулировать мой вопрос: как мне убедиться, что массив пуст в ответ, и не пройти проверку, если это не так? Извините, за путаницу. - person GameFromScratch; 08.08.2019
comment
Затем вы можете использовать "maxItems": 0 для этой проверки. Но обратите внимание, что тогда items определений в схеме не будет иметь смысла, поэтому вам, вероятно, следует удалить их. - person lahiruk; 08.08.2019
comment
Итак, если у меня нет определения «элементов», произойдет ли ошибка, если KeyToCheck не пуст? - person GameFromScratch; 08.08.2019
comment
Да. Вы можете проверить свою схему здесь. jsonschemavalidator.net - person lahiruk; 09.08.2019