我的目标是基于属性的存在来更改架构。这些是我的架构:
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”模式。
任何想法?
显然我的状况不对。我需要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
}
}