使用负面的lookbehind和jsonschema

时间:2018-01-23 17:49:19

标签: javascript node.js regex jsonschema ajv

我使用的是Node 9.2.0和ajv 6.0.0。

我有一个架构,我希望使用负面的lookbehind,它被定义为:

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "release format",
    "description": "A Release Format",
    "type": "object",
    "properties": {
        "id": {"type": "integer"},
        "title": {
            "anyOf": [
                {
                    "type": "string",
                    "pattern": "^((?!itunes).)*$"
                },
                {
                    "type": "string",
                    "pattern": "^((?!exclusive).)*$"
                },
                {
                    "type": "string",
                    "pattern": "^((?!ringtone).)*$"
                }
            ]
        }
    }
}

但是,当我尝试使用以下数据使用AJV验证时:{"id": 123, "title": "world exclusive"}我没有收到验证错误。

代码:

const Ajv = require('ajv');
class Validator {
  constructor() {
    this.releaseFormatSchema = JSON.parse(fs.readFileSync('./schemas/release-format.json'));
    this.schemaValidator = new Ajv({allErrors: true});
  }

  validate(data) {
    let validate = this.schemaValidator.compile(this.releaseFormatSchema);
    let valid = validate(data);
    console.log(valid);
    console.log(validate);
  }
}

其中数据为:{"id": 123, "title": "world exclusive"}。我希望这会出错,但它目前告诉我数据是有效的。

1 个答案:

答案 0 :(得分:0)

@sln和@ClasG也找到了答案,anyOf标题模式之间的联合可以匹配:“除了包含itunes的字符串之外的所有字符”union“除了包含独占”union“......的字符串外,其中表示不包含所有禁用关键字的所有内容。它可以修复

  • 使用allOf代替anyOF

    "title": {
        "allOf": [
            {
                "type": "string",
                "pattern": "^((?!itunes).)*$"
            },
            {
                "type": "string",
                "pattern": "^((?!exclusive).)*$"
            },
            {
                "type": "string",
                "pattern": "^((?!ringtone).)*$"
            }
        ]
    }
    
  • 使用单一类型/模式:

    "title": {
        "type": "string",
        "pattern": "^((?!itunes|exclusive|ringtone).)*$"
    }