【问题标题】:JSON Validation using AJV使用 AJV 的 JSON 验证
【发布时间】:2016-08-23 01:49:14
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: json jsonschema ajv


    【解决方案1】:

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

    根据两种模式它都有效的原因是因为允许附加属性。

    你可以:

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

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2019-04-03
      • 1970-01-01
      • 2018-02-03
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2019-07-24
      相关资源
      最近更新 更多