我有以下JSON验证
var schema = {
"type": "object",
"required": ["name", "profession"],
"properties": {
"name": { "type": "string" },
"profession": {
"oneOf": [
{ "$ref": "#/definitions/developer" },
{ "$ref": "#/definitions/manager" }
]
}
},
"definitions": {
"developer": {
"type": "object",
"properties": {
"jobLevel": { "$ref": "#/definitions/jobLevels" },
"linesOfCode": { "type": "number" },
"languages": { "enum": ["C++", "C", "Java", "VB"] }
},
"required": ["jobLevel"]
},
"manager": {
"type": "object",
"properties": {
"jobLevel": { "$ref": "#/definitions/jobLevels" },
"peopleManaged": { "type": "number" },
"responsibilities": {
"type": "array",
"minItems": 1,
"items": "string",
"uniqueItems": true
}
},
"required": ["jobLevel"]
},
"jobLevels": { "enum": ["Beginner", "Senior", "Expert"] }
}
}
我尝试使用上面的验证字符串验证以下JSON字符串。
var validate = ajv.compile(schema);
var valid = validate({
"name": "David",
"profession": {
"jobLevel": "Expert",
"linesOfCode": 50000,
"languages": "Java"
},
});
在这里我收到消息" data.profession应该只匹配oneOf中的一个模式"尽管我只提供了一个具有正确实例变量的实例,例如数据。你能告诉我这里我做错了什么吗?顺便说一下,我使用了AJV验证器。
谢谢。
答案 0 :(得分:1)
这里的问题是,根据oneOf关键字中的两个模式,专业对象的对象是有效的,并且规范要求它对一个模式有效:https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#oneof
根据两种模式使其有效的原因是因为允许其他属性。
你可以:
additionalProperties
:false禁止其他字段