Использование ref в JSON Schema для ссылки на локальную схему на диске
У меня есть файл схемы JSON:
{
"id":"http://schema.acme.com/user",
"$schema":"http://json-schema.org/draft-06/schema#",
"definitions":{
"user":{
"description":"The name the user has selected",
"type":"object",
"required":[
"username",
"premium"
],
"properties":{
"username":{
"type":"string",
"maxLength":10,
"minLength":1
},
"premium":{
"type":"boolean"
}
}
}
}
}
и я хочу проверить это в отношении объекта JSON. Поэтому я создаю временный объект этого типа с этой схемой:
{
"id":"http://schema.acme.com/uName",
"$schema":"http://json-schema.org/draft-06/schema#",
"properties":{
"uName":{
"$ref":"smUserSchema.json#/definitions/user"
}
},
"required":[
"uName"
]
}
и у меня есть этот файл данных JSON:
{
"uName":{
"username":"Bob",
"premium":true
}
}
Цель здесь состоит в том, чтобы не вставлять мой временный объект в мою схему JSON для типа класса. (И да, одна из моих проблем заключается в том, что я пытаюсь использовать ОО-методы в JSON. Это правда, я просто делаю это по причинам повторного использования и наследования, возможно, есть лучший способ.)
Когда я иду, чтобы проверить это, я получаю эту ошибку:
$ ajv -s uNameSchema.json -d validUser.json
schema uNameSchema.json is invalid
error: can't resolve reference smUserSchema.json#/definitions/user from id http://schema.acme.com/uName#
Как включить схему JSON в другую схему?
Смотрите также:
2 ответа
Вы должны убедиться, что AJV знает smUserSchema.json
, он не найдет его автоматически. Есть опция командной строки для передачи зависимых схем, но я не могу вспомнить ее случайно. ajv --help должен сказать вам (у меня его нет в наличии).
Вы установили схему, на которую хотите сослаться
http://schema.acme.com/user
.
Однако вы используете относительную ссылку
smUserSchema.json#/definitions/user
, который решает
http://schema.acme.com/smUserSchema.json#/definitions/user
.
Вам нужно изменить либо
$id
определенный в схеме, на которую указывает ссылка, или относительный URI, используемый для
$ref
, чтобы они совпадали.
Я понимаю, что этот ответ немного запоздал, и я надеюсь, что вы решили свою проблему раньше, но он все еще может быть полезен для других.