AJV - 引用外部模式而不先添加它

Posted

技术标签:

【中文标题】AJV - 引用外部模式而不先添加它【英文标题】:AJV - Reference external schema without adding it first 【发布时间】:2021-03-06 23:11:37 【问题描述】:

是否可以使用 AJV 来引用以前未通过 addSchema() 添加的架构?

我想解析这样的引用:


    "$schema": "http://json-schema.org/draft-07/schema",
    "type": "object",
    "additionalProperties": false,
    "properties": 
        "id": 
            "$ref": "project-id.schema.json#/definitions/id"
        
    

没有先明确添加project-id.schema.json

【问题讨论】:

【参考方案1】:

给定

answer.json


  "$id": "***://schemas/answer.json",
  "type": "object",
  "properties": 
    "id": 
      "$ref": "id.json#"
    
  

id.json


  "$id": "***://schemas/id.json",
  "type": "string"

通过schemas 选项一次性添加所有架构

const Ajv = require('ajv');
const ajv = new Ajv(
  schemas: [
    require('./id.json'),
    require('./answer.json')
  ]
);

const validate = ajv.getSchema('***://schemas/answer.json');

validate(42);
//=> false
validate(id: 42);
//=> false
validate(id: '?');
//=> true

使用loadSchema 选项加载引用的架构

在这种情况下,您确实需要将要编译的架构作为对象传递,但如果该架构包含对 Ajv 未知的其他架构的引用,这些将通过 loadSchema 加载:

const Ajv = require('ajv');
const ajv = new Ajv(
  loadSchema: function (uri) 
    return new Promise((resolve, reject) => 
      if (uri === '***://schemas/id.json') 
        resolve(require('./id.json')); // replace with http request for example
       else 
        console.log('wat')
        reject(new Error(`could not locate $uri`));
      
    );
  
);

const test = async () => 
  // Schemas referenced in answer.json will be loaded by the loadSchema function
  const validate = await ajv.compileAsync(require('./answer.json'));
  validate(42) //=> false
  validate(id: 42) //=> false
  validate(id: '?') //=> true


test();

【讨论】:

以上是关于AJV - 引用外部模式而不先添加它的主要内容,如果未能解决你的问题,请参考以下文章

将文件添加到 tar 存档而不先保存

让 JComboBox 在 JTable 中显示而不先单击它

重新加载 PyQt5 应用程序而不先重新启动它

如何在vue js中动态设置状态而不先声明它

从 Unix 读取而不使用 Spring Integration 复制到本地时发现循环引用

创建 C# 客户端使用 SOAP 服务而不使用内置的“添加服务引用...”