#javascript #jsonschema #ajv
#javascript #jsonschema #ajv
Вопрос:
Я хочу проверить JSON на соответствие схеме JSON с Ajv в JavaScript. Я получаю сообщение об ошибке:
создайте новый.Ошибка MissingRefError(it.BaseID, $schema, $message); ^ Ошибка: не удается разрешить ссылку #/definitions/requestGraph из id requestGetGraphs
При удалении ссылки на другую схему: { «$ref»: «#/definitions/requestGraph» } ошибка исчезает.
JavaScript-код:
ajv.addSchema(require('./json-schema/graph-response'), 'graph-response.json');
ajv.validate('requestGetGraphs', `{"type" : "requestGetGraphs", "space" : "config", "v" : 1.1, "id" : "dsaf" }`);
graph-request.json:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id" : "graph-requests.json",
"definitions": {
"requestGraph" : {
"$id" : "#/definitions/requestGraph",
"allOf" : [
{ "$ref" : "call.json/#/definitions/request" },
{
"properties": {
"space": {
"$id" : "#requestGraph/properties/space",
"type": "string",
"const": "config"
}
}
}
]
}
},
"requestGetGraphs" : {
"$id" : "requestGetGraphs",
"type" : "object",
"allOf" : [
{
"properties": {
"action": {
"$id" : "#requestGetGraphs/properties/action",
"type": "string",
"const": "requestGetGraphs"
}
}
},
{ "$ref" : "#/definitions/requestGraph" }
]
}
}
Ответ №1:
Если вы здесь из-за @typescript-eslint
связанной ошибки сборки can't resolve reference #/definitions/directiveConfigSchema from id #
, которая вчера появилась неожиданно, просто понизьте «@typescript-eslint / eslint-plugin» до версии «5.33.0». Если у вас его нет в вашем package.json, просто добавьте его (без ^ в версии). Удалите yarn.lock , package-lock.json и node_modules и перестройте.
Дополнительная информация на https://github.com/typescript-eslint/typescript-eslint/issues/5525
Комментарии:
1. Я прокомментировал эту тему, потому что это был первый результат, когда вы обнаружили ошибку в Google.
2. Кажется, последняя версия нуждается в исправлении. Просто поддержал ваш ответ.
3. Подтвердите, что это исправление работает
4. Обновите
v5.35.1
, чтобы использовать@typescript-eslint
исправление пакета
Ответ №2:
Это связано с разрешением URI. Проверьте https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01#section-8.2.2
Когда «$ id» задает базовый URI, объект, содержащий этот «$ id» и все его подсхемы, может быть идентифицирован с помощью
фрагмента указателя JSON, начинающегося с этого местоположения. Это верно даже
для подсхем, которые дополнительно изменяют базовый URI. Таким образом, одна
подсхема может быть доступна несколькими URI, каждый из которых состоит из базового URI, объявленного в подсхеме или родительском, вместе с
фрагментом указателя JSON, идентифицирующим путь от объекта схемы, который объявляет
базу, до идентифицируемой подсхемы. Примеры этого
приведены в разделе 8.2.4.
Поскольку вы указали requestGetGraphs
без хэша впереди, он разрешается как новая схема (потому что это не фрагмент). Добавление к вашему идентификатору $id хэша означает, что это идентификатор фрагмента, и разрешение URI происходит соответствующим образом.
Вы , наверное, тоже хотели свить гнездо requestGetGraphs
внутри properties
, верно?
Комментарии:
1. Ссылка находится внутри того же файла. Я также могу прочитать документацию для ajv. Но что не так с моим кодом?
2. Извините, я неправильно понял. Я посмотрю еще раз.
3. Спасибо, я решил эту проблему. Мне пришлось установить для основного корня значение «$id»: » example.com/graph-requests.json # » и поместите хэш перед идентификатором в requestGetGraphs. Затем мне пришлось выполнить проверку с помощью ref: graph-requests.json#/requestGetGraphs . Не могли бы вы удалить свой первый ответ? У меня уже есть эта теория, и другим будет легче читать этот пост.
4. Супер! Я удалю свой первый ответ и отредактирую заголовок вашего вопроса, чтобы лучше отразить вопрос.
5. Вам не нужно было устанавливать полный root $id, но это также хорошая практика.