ajv-keywords

中文文档
5.1.0发布于 2021/11/22MITTypeScriptCommonJS近 30 天下载 3.5亿

Ajv JSON 验证器的附加 JSON- Schema 关键词

中文使用文档
文档目录13 节
  1. 目录
  2. 安装
  3. 使用量
  4. 关键词
  5. 类型
  6. 数字关键词
  7. 字符串关键字
  8. 数组的关键字
  9. 对象的关键字
  10. 所有类型的关键词
  11. 安全联络
  12. 开源软件支持
  13. 许可证

ajv 关键词

自定义 JSON-Schema 关键词 亚日弗 校验符

build npm npm downloads coverage gitter

请注意: 此读取文件用于 ajv-关键词 v5.0.0 应当用于 ajvv v8 (英语)。 。 。 .

ajv 关键词 v3 应使用 ajvv 第6页。 。 。 .

目录

* 联合国 - 修改数据的关键词 + 键 - 不支持的关键词 独立验证代码

安装

要安装版本 4 要使用 Ajv v7 (英语)数字 :

npm install ajv-keywords

使用量

添加所有可用的关键字 :

const Ajv = require("ajv")
const ajv = new Ajv()
require("ajv-keywords")(ajv)

ajv.validate({instanceof: "RegExp"}, /.*/) // true
ajv.validate({instanceof: "RegExp"}, ".*") // false

添加单一关键字 :

require("ajv-keywords")(ajv, "instanceof")

要添加多个关键字 :

require("ajv-keywords")(ajv, ["typeof", "instanceof"])

要直接添加单一关键字( 避免添加未使用的代码) :

require("ajv-keywords/dist/keywords/select")(ajv, opts)

要通过 Ajv 选项添加所有关键字 :

const ajv = new Ajv({keywords: require("ajv-keywords/dist/definitions")(opts)})

要通过选项添加一个或多个关键字:

const ajv = new Ajv({
  keywords: [
    require("ajv-keywords/dist/definitions/typeof")(),
    require("ajv-keywords/dist/definitions/instanceof")(),
    // select exports an array of 3 definitions - see "select" in docs
    ...require("ajv-keywords/dist/definitions/select")(opts),
  ],
})

opts 是带有属性的可选对象 defaultMeta - meta-schema的URI,用于使用子chemas的关键词(select 财务报告和审定财务报表 deepProperties) (中文(简体) ). 默认是 "http://json-schema.org/schema"。 。 。 .

关键词

类型

typeof

基于 Java 脚本 typeof 操作.

关键词的值应为字符串("undefined", (中文(简体) ), "string", (中文(简体) ), "number", (中文(简体) ), "object", (中文(简体) ), "function", (中文(简体) ), "boolean" 或者说 "symbol")或一系列字符串.

通过验证结果 typeof 值上的操作应该等于字符串(或数组中的字符串之一).

ajv.validate({typeof: "undefined"}, undefined) // true
ajv.validate({typeof: "undefined"}, null) // false
ajv.validate({typeof: ["undefined", "object"]}, null) // true

instanceof

基于 Java 脚本 instanceof 操作.

关键词的值应为字符串("Object", (中文(简体) ), "Array", (中文(简体) ), "Function", (中文(简体) ), "Number", (中文(简体) ), "String", (中文(简体) ), "Date", (中文(简体) ), "RegExp" 或者说 "Promise")或一系列字符串.

通过验证结果 data instanceof ... 在数值上的操作应当为真 :

ajv.validate({instanceof: "Array"}, []) // true
ajv.validate({instanceof: "Array"}, {}) // false
ajv.validate({instanceof: ["Array", "Function"]}, function () {}) // true

您可以添加您自己的构建器函数以通过此关键词识别 :

class MyClass {}
const instanceofDef = require("ajv-keywords/dist/definitions/instanceof")
instanceofDef.CONSTRUCTORS.MyClass = MyClass
ajv.validate({instanceof: "MyClass"}, new MyClass()) // true

请注意: 当前 instanceof 不支持在 独立验证代码 - 必须作为 code 关键词 支持《公约》,欢迎加入.

数字关键词

range 财务报告和审定财务报表 exclusiveRange

最小和最大关键词组合的语法糖(或排他性最小和排他性Maximum),如果范围中没有数字,也失败了计划汇编.

这些关键词的值必须是由两个数字组成的数组,第二个必须大于或等于第一个数字.

如果验证值不是一个数字,则验证通过,否则,验证值应大于(或等于)第一个数字,并小于(或等于)数组中的第二个数字.

const schema = {type: "number", range: [1, 3]}
ajv.validate(schema, 1) // true
ajv.validate(schema, 2) // true
ajv.validate(schema, 3) // true
ajv.validate(schema, 0.99) // false
ajv.validate(schema, 3.01) // false

const schema = {type: "number", exclusiveRange: [1, 3]}
ajv.validate(schema, 1.01) // true
ajv.validate(schema, 2) // true
ajv.validate(schema, 2.99) // true
ajv.validate(schema, 1) // false
ajv.validate(schema, 3) // false

字符串关键字

regexp

此关键词允许使用图案中带有旗帜的正则表达式, 也可以不使用 "u" 需要时的旗帜(标准) pattern 关键字不支持旗帜,并暗示存在 "u" 旗帜).

此关键字仅适用于字符串 。 如果数据不是字符串,则验证成功.

此关键字的值可以是字符串( 由 regexp.toString())或带有属性的对象 pattern 财务报告和审定财务报表 flags (应该传递给 RegExp 构造器的相同字符串).

const schema = {
  type: "object",
  properties: {
    foo: {type: "string", regexp: "/foo/i"},
    bar: {type: "string", regexp: {pattern: "bar", flags: "i"}},
  },
}

const validData = {
  foo: "Food",
  bar: "Barmen",
}

const invalidData = {
  foo: "fog",
  bar: "bad",
}

transform

此关键词允许在验证时修改字符串 .

此关键字仅适用于字符串 。 如果数据不是字符串,则 transform 关键字被忽略 .

一个独立的字符串不能被修改,即:. data = 'a'; ajv.validate(schema, data);,因为字符串是通过值传递的

支持的转换 :

  • trim: 删除起始和结尾的空白
  • trimStart编号 :trimLeft: 从开始去除空白
  • trimEnd编号 :trimRight: 从末尾去除空白
  • toLowerCase: 转换为小写
  • toUpperCase: 转换为大写
  • toEnumCase: 更改字符串大小写为等于其中之一 enum 计划中的数值

转换按所列顺序进行.

说明: toEnumCase 要求所有允许的值在大小写不敏感时是独一无二的.

示例:多重转换

require("ajv-keywords")(ajv, "transform")

const schema = {
  type: "array",
  items: {
    type: "string",
    transform: ["trim", "toLowerCase"],
  },
}

const data = ["  MixCase  "]
ajv.validate(schema, data)
console.log(data) // ['mixcase']

示例 enumcase

require("ajv-keywords")(ajv, ["transform"])

const schema = {
  type: "array",
  items: {
    type: "string",
    transform: ["trim", "toEnumCase"],
    enum: ["pH"],
  },
}

const data = ["ph", " Ph", "PH", "pH "]
ajv.validate(schema, data)
console.log(data) // ['pH','pH','pH','pH']

数组的关键字

uniqueItemProperties

关键词允许检查数组项中的某些属性是独一无二的 .

此关键字仅适用于数组 。 如果数据不是数组,则验证成功.

此关键字的值必须是一系列字符串 - 属性名称, 在所有项目中都有独特的值 .

const schema = {
  type: "array",
  uniqueItemProperties: ["id", "name"],
}

const validData = [{id: 1}, {id: 2}, {id: 3}]

const invalidData1 = [
  {id: 1},
  {id: 1}, // duplicate "id"
  {id: 3},
]

const invalidData2 = [
  {id: 1, name: "taco"},
  {id: 2, name: "taco"}, // duplicate "name"
  {id: 3, name: "salsa"},
]

此关键字由下列人员提供: @blainesch (英语)。 。 。 .

请注意: 当前 uniqueItemProperties 不支持在 独立验证代码 - 必须作为 code 关键词 支持《公约》,欢迎加入.

对象的关键字

allRequired

此关键词允许要求存在用于 properties 同一计划对象中的关键词 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值必须是布尔值 .

如果关键词的值是 false,验证成功.

如果关键词的值是 true,如果数据包含在 properties 关键词(在同一schema对象中).

如果 properties 关键词不在同一计划对象中存在,计划汇编会丢出例外.

const schema = {
  type: "object",
  properties: {
    foo: {type: "number"},
    bar: {type: "number"},
  },
  allRequired: true,
}

const validData = {foo: 1, bar: 2}
const alsoValidData = {foo: 1, bar: 2, baz: 3}

const invalidDataList = [{}, {foo: 1}, {bar: 2}]

anyRequired

此关键字允许要求列表中存在任何(至少一个)属性 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值必须是字符串的数组,每个字符串都是属性名. 要使数据对象有效,该对象中至少应存在该数组中的一个属性.

const schema = {
  type: "object",
  anyRequired: ["foo", "bar"],
}

const validData = {foo: 1}
const alsoValidData = {foo: 1, bar: 2}

const invalidDataList = [{}, {baz: 3}]

oneRequired

此关键字允许从列表中只要求有一个属性存在 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值必须是字符串的数组,每个字符串都是属性名. 要使数据对象完全有效,该数组中的属性之一应在对象中存在.

const schema = {
  type: "object",
  oneRequired: ["foo", "bar"],
}

const validData = {foo: 1}
const alsoValidData = {bar: 2, baz: 3}

const invalidDataList = [{}, {baz: 3}, {foo: 1, bar: 2}]

patternRequired

此关键字允许要求存在符合某些模式的属性 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值应该是字符串的数组,每个字符串都是正则表达式. 要使数据对象在这个阵列中每个正则表达式有效,数据对象中至少应匹配一个属性名称.

如果数组包含多个正则表达式,则多个表达式可以匹配同一个属性名称.

const schema = {
  type: "object",
  patternRequired: ["f.*o", "b.*r"],
}

const validData = {foo: 1, bar: 2}
const alsoValidData = {foobar: 3}

const invalidDataList = [{}, {foo: 1}, {bar: 2}]

prohibited

此关键词允许禁止将列表中的任何属性存在于对象中.

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

此关键字的值应该是字符串的数组,每个字符串都是属性名. 要使数据对象有效,该数组中的任何属性都不应出现在对象中.

const schema = {
  type: "object",
  prohibited: ["foo", "bar"],
}

const validData = {baz: 1}
const alsoValidData = {}

const invalidDataList = [{foo: 1}, {bar: 2}, {foo: 1, bar: 2}]

请注意数字 : {prohibited: ['foo', 'bar']} 等同为 {not: {anyRequired: ['foo', 'bar']}} (即对任何数据具有相同的验证结果).

deepProperties

此关键词允许验证深层属性(由JSON指针识别).

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

值应为对象,其中键为JSON指向数据,从数据中当前位置开始,值为JSON schemas. 要使数据对象有效,每个JSON指针的值应根据相应的方案有效.

const schema = {
  type: "object",
  deepProperties: {
    "/users/1/role": {enum: ["admin"]},
  },
}

const validData = {
  users: [
    {},
    {
      id: 123,
      role: "admin",
    },
  ],
}

const alsoValidData = {
  users: {
    1: {
      id: 123,
      role: "admin",
    },
  },
}

const invalidData = {
  users: [
    {},
    {
      id: 123,
      role: "user",
    },
  ],
}

const alsoInvalidData = {
  users: {
    1: {
      id: 123,
      role: "user",
    },
  },
}

deepRequired

此关键词允许检查一些深层属性( 由 JSON 指针识别) 可用 .

本关键词仅适用于对象。 如果数据不是对象,则验证成功.

数值应该是JSON指向数据的数组,从数据中的当前位置开始. 要使数据对象有效,每个JSON指针应该是数据中已有的部分.

const schema = {
  type: "object",
  deepRequired: ["/users/1/role"],
}

const validData = {
  users: [
    {},
    {
      id: 123,
      role: "admin",
    },
  ],
}

const invalidData = {
  users: [
    {},
    {
      id: 123,
    },
  ],
}

见 json-schema-org/json-schema-spec#203 互联网档案馆的存檔,存档日期2013-12-22 例如,当一个图案没有 deepRequired 关键词.

所有类型的关键词

select编号 :selectCases编号 :selectDefault

请注意:这些关键词被贬值. 建议使用 OpenAPI 歧视者 关键字由 Ajv v8 支持而不是 select。 。 。 .

这些关键词允许选择用于根据已验证数据中某些属性的价值验证数据的方案.

这些关键词必须在同一计划对象中存在(selectDefault 为可选的).

价值 select 关键词应为: 数据参考 指向被验证数据中的任何原始JSON类型(字符串、数字、布尔或无效)。 也可以使用原始类型的常数作为这个关键词的值(例如为调试目的).

价值 selectCases 关键字必须是对象,其中每个属性名称都可能是字符串表示值: select 关键词和每个属性值是一个相应的计划(从草案06可以是布尔语),必须用来验证数据.

价值 selectDefault 关键词是用于验证数据以防万一的 schema(也可以是布尔语) selectCases 没有键值等于 select 关键词.

鉴定在下列情形中成功: 1

  • 使用选定的计划验证数据成功,
  • 没有一个计划是用来验证的,
  • 选择的值是未定义的(数据引用的数据中没有属性).

若为 select 值(在数据中)不是验证失败的原始类型.

此关键字正确跟踪被评价的属性和要与之合作的项目 unevaluatedProperties 财务报告和审定财务报表 unevaluatedItems 关键字 - 只使用子schema 中的属性和项目(其中之一) selectCases 子计划或 selectDefault 标记为 subschema) .

请注意: 这些关键字需要 Ajv $data 选项 数据参考。 。 。 .

require("ajv-keywords")(ajv, "select")

const schema = {
  type: "object",
  required: ["kind"],
  properties: {
    kind: {type: "string"},
  },
  select: {$data: "0/kind"},
  selectCases: {
    foo: {
      required: ["foo"],
      properties: {
        kind: {},
        foo: {type: "string"},
      },
      additionalProperties: false,
    },
    bar: {
      required: ["bar"],
      properties: {
        kind: {},
        bar: {type: "number"},
      },
      additionalProperties: false,
    },
  },
  selectDefault: {
    propertyNames: {
      not: {enum: ["foo", "bar"]},
    },
  },
}

const validDataList = [
  {kind: "foo", foo: "any"},
  {kind: "bar", bar: 1},
  {kind: "anything_else", not_bar_or_foo: "any value"},
]

const invalidDataList = [
  {kind: "foo"}, // no property foo
  {kind: "bar"}, // no property bar
  {kind: "foo", foo: "any", another: "any value"}, // additional property
  {kind: "bar", bar: 1, another: "any value"}, // additional property
  {kind: "anything_else", foo: "any"}, // property foo not allowed
  {kind: "anything_else", bar: 1}, // property bar not allowed
]

dynamicDefaults

此关键词允许为属性指定动态默认值,例如时间戳,独特的ID等.

此关键词只有在 useDefaults 选项被使用而不在内部 anyOf 关键词等,与 ajv 处理的默认关键字。 。 。 .

应在对象级别上添加关键词。 其价值应为每个财产对应财产名称的对象,其方式与标准 properties 关键词 每个财产的价值可以是:

  • 动态默认函数的标识符(字符串)
  • 有属性的对象 func (标识)和 args (一个有参数的对象,将在计划汇编过程中传递到此函数 - 参见示例).

使用的属性 dynamicDefaults 不应添加到 required 同一方案的关键字( 或验证会失败) , 因为不同于 default 此关键字在验证后处理.

有几种预定义的动态默认函数:

  • "timestamp" - 以毫秒计的当前时间戳
  • "datetime" - 作为字符串的当前日期和时间(ISO,根据 date-time 格式)
  • "date" - 当前日期为字符串(ISO,根据 date 格式)
  • "time" - 当前时间作为字符串(ISO,根据 time 格式)
  • "random" - [0, 1] 间隔中的伪随机数
  • "randomint" - 假随机整数 如果字符串用作属性值,则函数会随机返回 0 或 1 。 如果对象 { func: 'randomint', args: { max: N } } 然后使用默认值为 [0, N] 间隔中的整数.
  • "seq" - 从0开始的相继整数。 如果字符串用作属性值,则会使用默认序列. 如果对象 { func: 'seq', args: { name: 'foo'} } 然后使用带有名称的序列 "foo" 将被使用。 序列是全球性的,即使使用不同的 ajv 例.
const schema = {
  type: "object",
  dynamicDefaults: {
    ts: "datetime",
    r: {func: "randomint", args: {max: 100}},
    id: {func: "seq", args: {name: "id"}},
  },
  properties: {
    ts: {
      type: "string",
      format: "date-time",
    },
    r: {
      type: "integer",
      minimum: 0,
      exclusiveMaximum: 100,
    },
    id: {
      type: "integer",
      minimum: 0,
    },
  },
}

const data = {}
ajv.validate(data) // true
data // { ts: '2016-12-01T22:07:28.829Z', r: 25, id: 0 }

const data1 = {}
ajv.validate(data1) // true
data1 // { ts: '2016-12-01T22:07:29.832Z', r: 68, id: 1 }

ajv.validate(data1) // true
data1 // didn't change, as all properties were defined

使用时 useDefaults 选项值 "empty",属性和物品等于 null 或者说 "" (空字符串)将被视为缺失并指定默认值 。 使用 allOf 复合关键字 要执行 dynamicDefaults 在验证之前.

const schema = {
  type: "object",
  allOf: [
    {
      dynamicDefaults: {
        ts: "datetime",
        r: {func: "randomint", args: {min: 5, max: 100}},
        id: {func: "seq", args: {name: "id"}},
      },
    },
    {
      properties: {
        ts: {
          type: "string",
        },
        r: {
          type: "number",
          minimum: 5,
          exclusiveMaximum: 100,
        },
        id: {
          type: "integer",
          minimum: 0,
        },
      },
    },
  ],
}

const data = {ts: "", r: null}
ajv.validate(data) // true
data // { ts: '2016-12-01T22:07:28.829Z', r: 25, id: 0 }

您可以添加您自己的动态默认函数以通过此关键词识别 :

const uuid = require("uuid")

const def = require("ajv-keywords/dist/definitions/dynamicDefaults")
def.DEFAULTS.uuid = () => uuid.v4

const schema = {
  dynamicDefaults: {id: "uuid"},
  properties: {id: {type: "string", format: "uuid"}},
}

const data = {}
ajv.validate(schema, data) // true
data // { id: 'a1183fbe-697b-4030-9bcc-cfeb282a9150' };

const data1 = {}
ajv.validate(schema, data1) // true
data1 // { id: '5b008de7-1669-467a-a5c6-70fa244d7209' }

您也可以定义接受参数的动态默认值,例如uuid的版本:

const uuid = require("uuid")

function getUuid(args) {
  const version = "v" + ((arvs && args.v) || "4")
  return uuid[version]
}

const def = require("ajv-keywords/dist/definitions/dynamicDefaults")
def.DEFAULTS.uuid = getUuid

const schema = {
  dynamicDefaults: {
    id1: "uuid", // v4
    id2: {func: "uuid", v: 4}, // v4
    id3: {func: "uuid", v: 1}, // v1
  },
}

请注意: 动态默认函数按它们拥有的参数数加以区分(function.length) (中文(简体) ). 不期望默认的函数必须有一个非可选参数,这样 function.length > 0 个.

dynamicDefaults 不支持在 独立验证代码。 。 。 .

安全联络

请使用 电梯安全联络。 。 。 . Tidelift将协调固定和披露.

请不要通过 GitHub 问题报告安全漏洞 .

开源软件支持

Ajv 键词是 收费 - 除了软件维护者提供的支助外,它还向开源软件用户提供集中支持.

许可证

麻省理工学院

版本与发布记录

ajv-keywords 共发布 43 个版本,首次发布于 2016/06/06;过去 12 个月发布了 0 个版本。

版本发布日期距今
5.1.0latest2021/11/224 年前
5.0.02021/03/285 年前
4.0.12021/03/255 年前
5.0.0-beta.1beta2021/03/245 年前
5.0.0-beta.02021/03/135 年前
4.0.02020/12/165 年前

关于 ajv-keywords 的常见问题

ajv-keywords 是什么?

Ajv JSON 验证器的附加 JSON- Schema 关键词

如何安装 ajv-keywords?

在项目目录运行 npm install ajv-keywords,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:ajv(^8.8.2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

ajv-keywords 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

ajv-keywords 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

ajv-keywords 可以商用吗?

ajv-keywords 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

ajv-keywords 的下载量有多少?

根据 npm 官方下载统计,ajv-keywords 在 2026/10/05 – 2026/11/03 这 30 天内被下载 347,313,401 次,日均约 11,577,113 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

ajv-keywords 还在维护吗?

最新版本 5.1.0 发布于 2021/11/22(4 年前);至今共发布 43 个版本,其中过去 12 个月发布了 0 个;首次发布于 2016/06/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。