es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    const Ajv = require('ajv');
    const fs = require('fs');
    const $RefParser = require('json-schema-ref-parser');
    
    $RefParser.dereference('./schemata/my.schema.json', (err, schema) => {
      if (err) {
        console.error(err);
        return;
      }
    
      const ajv = new Ajv();
      const validate = ajv.compile(schema.$defs.oid_list);
      const data = ['wibble', 'wobble'];
      const valid = validate(data);
    
      console.log(valid);
    });
    

    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 o json-schema-tools. La clave es resolver las referencias $ref antes de validar.

Comments are closed.