ajv 关键词
自定义 JSON-Schema 关键词 亚日弗 校验符
请注意: 此读取文件用于 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 键词是 收费 - 除了软件维护者提供的支助外,它还向开源软件用户提供集中支持.