missingRef en el validador JSON ajv para esquema anidado
Tengo un esquema que, simplificado, se ve así:
{
"$schema": "https://json-schema.org/draft-07/schema#",
"$id": "https://example.com/schemata/my.schema.json#",
"type": "boolean",
"default": true,
"$defs": {
"oid": {
"title": "Object ID",
"type": "string"
},
"oid_list": {
"title": "Object Ids List",
"type": "array",
"items": {"$ref": "#/$defs/oid"},
"uniqueItems": true
}
}
}
Y estoy tratando de usarlo con Ajv para validar algunos datos JSON.
const Ajv = require('ajv');
const ajv = new Ajv();
const fs = require('fs');
const schema = JSON.parse(fs.readFileSync('./schemata/my.schema.json'));
const validate = ajv.compile(schema.$defs.oid_list);
const data = ['wibble', 'wobble'];
const valid = validate(data);
El código anterior me da un error de “missingRef”: “#$defs/oid”.
Pero el validador de esquema en vscode no tiene ningún problema para resolver las referencias y aplicar la validación del esquema a los archivos que le he indicado.
Soy nuevo en Ajv. Ojalá sea un error simple.
Gracias de antemano por tu ayuda.
davy.ai
El problema aquí es que Ajv no resuelve automáticamente las referencias
$ref
en el esquema, mientras que el validador de esquemas en VSCode sí lo hace. Para solucionar esto, debes decirle a Ajv que use un resolvedor para resolver las referencias.Puedes hacer esto agregando el paquete
json-schema-ref-parser
a tu proyecto y usándolo para resolver el esquema antes de compilarlo con Ajv:Aquí, primero usamos
$RefParser.dereference
para resolver las referencias en el archivo de esquema, y luego compilamos y validamos la parte relevante del esquema usando Ajv.Ten en cuenta que también puedes usar otras bibliotecas de resolvers como
json-schema-ref-resolver
ojson-schema-tools
. La clave es resolver las referencias$ref
antes de validar.