使用 Python 内联外部 jsonschema 引用

问题描述 投票:0回答:1

我有一个类似于这个问题的问题,除了我想做的就是获取外部引用并内联它们。

例如,假设我有一个像这样的模式:

{
    "$defs": {
        "JSONSchema": {
            "$ref": "https://json-schema.org/draft/2020-12/schema"
        }
    },
    "properties": {
        "config_1_jsonschema": {
            "$ref": "#/$defs/JSONSchema"
        },
        "config_2_jsonschema": {
            "$ref": "#/$defs/JSONSchema"
        }
    }
}

我有两个引用

JSONSchema
定义的字段,该定义又引用 JSONSchema 元模式的 URL。我想取消引用 URL,内联该架构,并递归内联其所有外部引用,但不内联两个属性的本地引用。

如何在保持架构有效的同时解决这个问题? Python 中是否有现有的库可以让我做到这一点?

python json reference jsonschema inlining
1个回答
0
投票

如果满足一些条件,您可以安全地将外部模式的内容复制到您的模式中。

  1. 外部模式必须有一个
    $id
    关键字。
  2. 如果外部模式使用与本地模式不同的方言 (
    $schema
    ),则外部模式必须具有
    $schema
    关键字。
  3. 您只能内联完整架构资源,而不能内联子架构。
  4. 您还需要包含引用架构中的任何外部引用。

就你而言,唯一棘手的部分是最后一部分

{
    "$defs": {
        "JSONSchema": {
            "$ref": "https://json-schema.org/draft/2020-12/schema"
        },
        "draft-2020-12-schema": {
            "$id": "https://json-schema.org/draft/2020-12/schema",
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            ...
            "allOf": [
                { "$ref": "meta/core" },
                { "$ref": "meta/applicator" },
                { "$ref": "meta/unevaluated" },
                { "$ref": "meta/validation" },
                { "$ref": "meta/meta-data" },
                { "$ref": "meta/format-annotation" },
                { "$ref": "meta/content" }
            ],
            ...
        },
        "draft-2020-12-core-vocab": {
            "$id": "https://json-schema.org/draft/2020-12/meta/core",
            "$schema": "https://json-schema.org/draft/2020-12/schema",
            ...
        },
        "draft-2020-12-applicator-vocab": { ... },
        ...
    },
    "properties": {
        "config_1_jsonschema": {
            "$ref": "#/$defs/JSONSchema"
        },
        "config_2_jsonschema": {
            "$ref": "#/$defs/JSONSchema"
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.