首页 > 解决方案 > 如何解析 JsonSchema 并将子模式移动到根?

问题描述

用 JavaScript 编写了一个模式,因为它更容易,我可以简单地运行它来将其转换为JSON

这部分很好,但现在我想提取一个子模式/定义,因为我想使用它的应用程序不会让我为我感兴趣的子模式指定 JSON 路径。

所以我试着写一个小脚本把它拉出来:

#!/usr/bin/env node
import Ajv from 'ajv';
import Path from 'path';
const ajv = new Ajv({
    $data: true,
});
ajv.addSchema(require(Path.resolve(process.argv[2])).default,'x');
const schema = ajv.getSchema(`x#/${process.argv[3]}`).schema;
console.log(JSON.stringify(schema,null,4));

但我得到的是:

{
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "name": {
            "$ref": "#/defs/Identifier"
        },
        "versions": {
            "type": "array",
            "items": {
                "$ref": "#/defs/TableVersion"
            }
        }
    },
    "required": [
        "name",
        "versions"
    ]
}

即,我丢失了其他定义!

AJV 中是否有一些 API 方法可以在不破坏所有 $refs 的情况下提取子模式?

标签: javascriptjsonschemaajv

解决方案


我用不同的图书馆做到了。

这是我想出的脚本:

#!/usr/bin/env node
import $RefParser from 'json-schema-ref-parser';
import Path from 'path';

async function main() {
    const parser = new $RefParser();
    const [file,$ref] = process.argv[2].split('#');
    let rawSchema = require(Path.resolve(file));
    if(rawSchema.__esModule) {
        rawSchema = rawSchema.default;
    }
    let schema = await parser.dereference(rawSchema);
    if($ref) {
       schema = await parser.$refs.get('#'+$ref); 
    }
    console.log(JSON.stringify(schema,null,4));
}

main().catch(err => {
    process.stderr.write(`${err}\n`);
    process.exit(1);
});

用法:

node export-schema.js table.schema.js#/defs/Table > table.schema.json

推荐阅读