使用AJV进行JSON验证

时间:2016-04-28 10:42:03

标签: json jsonschema ajv

我有以下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验证器。

谢谢。

1 个答案:

答案 0 :(得分:1)

这里的问题是,根据oneOf关键字中的两个模式,专业对象的对象是有效的,并且规范要求它对一个模式有效:https://github.com/epoberezkin/ajv/blob/master/KEYWORDS.md#oneof

根据两种模式使其有效的原因是因为允许其他属性。

你可以:

  • 使用anyOf(50%的情况会更快,因为它会在第一个模式成功时停止验证)
  • 使用additionalProperties:false禁止其他字段