Понимание JSON ошибок схемы с использованием ajv - PullRequest
0 голосов
/ 07 апреля 2020

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

const schema = {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [ "countries" ],
  "definitions": {
    "europeDef": {
      "type": "object",
      "required": ["type"],
      "properties": { "type": {"const": "europe"} }
    },
    "asiaDef": {
      "type": "object",
      "required": ["type"],
      "properties": { "type": {"const": "asia"} }
    }
  },
  "properties": {
    "countries": {
      "type": "array",
      "items": {
        "oneOf":[
          { "$ref": "#/definitions/europeDef" },
          { "$ref": "#/definitions/asiaDef"}
        ]
      }
    }
  }
}
const data = {
  "countries":[
    {"type": "asia"},
    {"type": "europe1"}
  ]
}
const isValid = ajv.validate(schema, data); //schema, data
if(! isValid){
  console.log(ajv.errors);
}

и ошибка:

[
  {
    keyword: 'const',
    dataPath: '/countries/1/type',
    schemaPath: '#/definitions/europeDef/properties/type/const',
    params: { allowedValue: 'europe' },
    message: 'should be equal to constant'
  },
  {
    keyword: 'const',
    dataPath: '/countries/1/type',
    schemaPath: '#/definitions/asiaDef/properties/type/const',
    params: { allowedValue: 'asia' },
    message: 'should be equal to constant'
  },
  {
    keyword: 'oneOf',
    dataPath: '/countries/1',
    schemaPath: '#/properties/countries/items/oneOf',
    params: { passingSchemas: null },
    message: 'should match exactly one schema in oneOf'
  }
]

Я знаю, почему появляется ошибка (причина: поскольку я использовал 'europe1', а не соответствует стандарту схемы)

У меня есть следующие вопросы из описанной выше ситуации ошибки:

  1. Поскольку я предоставил «Азия» в качестве действительного конста, ошибка все еще говорит об «Азии» как части второй записи в массиве. Почему это показало как ошибку, несмотря на схему, абсолютно нормально с точки зрения Азии. Это потому, что «oneOf» привыкает? Другими словами, очень трудно понять, что и где ошибка, а что нет?

  2. Для Азии сообщение «message:» должно быть равно константе »(2-й пункт из массива) вводит в заблуждение ИМО. Создается впечатление, что с «Азией» все еще есть некоторые проблемы.

  3. Как разобрать эту ошибку: на основе schemaPath или dataPath? Кроме того, в любом случае все равно будет создаваться впечатление, что существует проблема с точки зрения «Азии» (а на самом деле ее нет)

  4. Кроме того, как объяснить вышеприведенный вывод ошибок для новичок, как еще скажет новичок, почему Азия становится частью ошибки, несмотря на ее исправление?

  5. Кроме того, если схема усложняется с помощью oneOf / anyOf, allOf или if-then-else, вывод ajv.errors становится более сложным для понимания и объяснения (при определенных обстоятельствах). условия точные, но отображаются как ошибки, например, Азия здесь)

  6. Существуют ли какие-либо теории / документация / руководящие принципы для лучшего понимания ошибок?

1 Ответ

1 голос
/ 07 апреля 2020

Для JSON Схема проекта 2019-09, мы создали несколько стандартизированных выходных форматов. ajv предоставляет один из наиболее полезных выходов из схемы черновика-07 по сравнению со многими библиотеками.

При просмотре ошибок вы можете пропустить значение dataPath.

В ответ на 1 все сообщения об ошибках относятся к пути данных /countries/1. /countries/0 хорошо, как вы говорите. Массивы в javascript начинаются с 0.

Я думаю, зная, что это также отвечает на все ваши другие вопросы.

Я думаю, вы, возможно, предположили, что массивы начинаются с 1, и путь к данным ссылался asia объекту, в то время как он фактически нацелен на europe1 объект.

Пожалуйста, прокомментируйте, если я что-то упустил, или вы все еще не понимаете это.

...