AJV使用JSONPath字符串验证架构

时间:2019-07-10 00:12:54

标签: node.js json jsonschema ajv

我正在尝试创建一个JSON模式,该模式可以支持使用属性值验证JSON对象,这些属性值可以是常规JSON类型或表示有效JSONpath表达式的字符串。

例如,给定以下架构:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "properties": {
    "age": {
      "type": "number"
    }
  }
}

这些JSON对象中的任何一个都可能有效:

{
  "age": 30 
}

{
  "age" "$.age"
}

我一直试图添加一个名为jsonPath的自定义关键字,就像这样:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "properties": {
    "age": {
      "type": "number",
      "jsonPath": true
    }
  }
}

ajv.addKeyword('jsonPath', {
  valid: true,
  compile: () => data => {
    return /^\$./.test(data)
  }
})

理想情况下,我希望能够检查给定的属性值是否为有效的JSONPath字符串,如果是,请批准它。否则,让ajv运行它自己的验证。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我不知道您是否可以阻止其他关键字运行。有多种方法可以将JSON模式中的检查应用于同一位置,因此这可能很困难,而且可能不是ajv支持的。

您可以将其构建到您的模式中。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "properties": {
    "age": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "pattern": "REGEX FOR JSON PATH"
        }
      ]

    }
  }
}

您可以使用definitions并使用$ref对其进行正则表达式重复数据删除。