У меня есть следующая схема и 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', а не соответствует стандарту схемы)
У меня есть следующие вопросы из описанной выше ситуации ошибки:
Поскольку я предоставил «Азия» в качестве действительного конста, ошибка все еще говорит об «Азии» как части второй записи в массиве. Почему это показало как ошибку, несмотря на схему, абсолютно нормально с точки зрения Азии. Это потому, что «oneOf» привыкает? Другими словами, очень трудно понять, что и где ошибка, а что нет?
Для Азии сообщение «message:» должно быть равно константе »(2-й пункт из массива) вводит в заблуждение ИМО. Создается впечатление, что с «Азией» все еще есть некоторые проблемы.
Как разобрать эту ошибку: на основе schemaPath или dataPath? Кроме того, в любом случае все равно будет создаваться впечатление, что существует проблема с точки зрения «Азии» (а на самом деле ее нет)
Кроме того, как объяснить вышеприведенный вывод ошибок для новичок, как еще скажет новичок, почему Азия становится частью ошибки, несмотря на ее исправление?
Кроме того, если схема усложняется с помощью oneOf / anyOf, allOf или if-then-else, вывод ajv.errors становится более сложным для понимания и объяснения (при определенных обстоятельствах). условия точные, но отображаются как ошибки, например, Азия здесь)
Существуют ли какие-либо теории / документация / руководящие принципы для лучшего понимания ошибок?