如何解析JsonSchema并将子模式移动到根?

时间:2018-06-07 01:07:35

标签: javascript jsonschema ajv

我写了schema in JavaScript,因为它更容易,我可以简单地将其转换为JSON

那部分都很好,但是现在我想提取一个子模式/定义,因为我想要使用它的应用程序不允许我为我感兴趣的子模式指定一个JSON路径。 / p>

所以我尝试编写一个小脚本来解决它:

#!/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方法可以在不破坏所有$ ref的情况下提取子模式?

1 个答案:

答案 0 :(得分:0)

我用不同的库做到了。

这是我提出的脚本:

#!/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