如何基于属性的存在来更改json模式?

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

我的目标是基于属性的存在来更改架构。这些是我的架构:

sample = {
    "type": "object",
    "properties": {
        "description": {"type": "string", "minLength": 1, "pattern": "^.*\w+.*$"},
        "owner_id": {"type": "string"},
        "privacy_setting": {"type": "string", "enum": ["private","group","account","public"]},
        "iam": iam,
        "timestamp": {"type": "integer", "minimum": 1000000000000, "maximum": 9999999999999},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["description","owner_id"],
    "additionalProperties": False
}

existing_sample = {
    "type": "object",
    "properties": {
        "id": {"type": "string"},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["id"],
    "additionalProperties": False
}

# final schema
final = {
    "type": "object",
    "patternProperties": {
        "^.+$": {
            "if": {
                "properties": {
                    "id": {"type": "string"}
                }
            },
            "then": existing_sample,
            "else": sample
        }
    },
    "additionalProperties": False
}

想法是在存在“ id”属性的情况下遵循“ existing_sample”模式,在缺少“ id”属性的情况下遵循“ sample”模式。

它在存在“ id”时按预期工作,这意味着,如果出现未指定的属性,它将引发异常:

不允许使用其他属性

但是如果缺少“ id”属性,它将返回异常:

'id'是必填属性

好像仍然遵循“ existing_sample”模式。

任何想法?

jsonschema json-schema-validator python-jsonschema
1个回答
0
投票

显然我的状况不对。我需要require一​​个“ id”属性,而不仅仅是指定“ id”属性架构。预期的工作如下:

# existing sample schema
existing_sample = {
    "type": "object",
    "properties": {
        "id": {"type": "string"},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["id"],
    "additionalProperties": False
}


# sample schema
sample = {
    "type": "object",
    "properties": {
        "owner_id": {"type": "string"},
        "description": {"type": "string", "minLength": 1, "pattern": "^.*\w+.*$"},
        "privacy_setting": {"type": "string", "enum": ["private","group","account","public"]},
        "iam": iam,
        "timestamp": {"type": "integer", "minimum": 1000000000000, "maximum": 9999999999999},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["description","owner_id"],
    "additionalProperties": False
}

# condition to choose between existing sample schema to new sample schema
# based on "id" property appearance
condition = {
    "type": "object",
    "if": {
        "required": ["id"],
    },
    "then": existing_sample,
    "else": sample
}

# final schema
final = {
    "type": "object",
    "patternProperties": {
        "^.+$": condition
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.