我正在尝试创建一个json模式,该模式根据对象的类型来验证对象。它选择正确的定义,但是不会验证所选定义中的必需属性。这是我正在尝试的json模式:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"literal": {
"type": "object",
"properties": {
"raw": { "type": "string" }
},
"required": ["raw"],
"additionalProperties": false
},
"identifier": {
"type": "object",
"properties": {
"name": { "type": "string" }
},
"required": ["name"],
"additionalProperties": false
}
},
"type": "object",
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"enum": ["Literal"]
},
"content": { "$ref": "#/definitions/literal" }
}
},
{
"type": "object",
"properties": {
"type": {
"enum": ["Identifier"]
},
"content": { "$ref": "#/definitions/identifier" }
}
}
],
"required": ["type"]
};
以下架构是有效的,即使缺少“ raw”属性也是如此:
{ "type" : "Literal" }
谢谢
答案 0 :(得分:2)
JSON模式规范中没有关键字content
。
一旦您在根架构中声明了"type":"object"
,就无需在子架构中再次进行此操作。
为了将对象type
的枚举值与关联的扩展定义结合在一起,需要使用allOf
关键字。
在定义中,如果使用"additionalProperties": false
,还必须列出对象的所有属性(请参见"type": {}
)。对于先前定义/验证的属性,您可以只使用许可模式:{}
或true
。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"literal": {
"properties": {
"type": {},
"raw": { "type": "string" }
},
"required": ["raw"],
"additionalProperties": false
},
"identifier": {
"properties": {
"type": {},
"name": { "type": "string" }
},
"required": ["name"],
"additionalProperties": false
}
},
"type": "object",
"oneOf": [
{
"allOf": [
{
"properties": {
"type": {
"enum": ["Literal"]
}
}
},
{"$ref": "#/definitions/literal"}
]
},
{
"allOf": [
{
"properties": {
"type": {
"enum": ["Identifier"]
}
}
},
{"$ref": "#/definitions/identifier" }
]
}
],
"required": ["type"]
}