我正在尝试使用模式来验证离子 Web 应用程序中的某些输入数据。但它似乎并没有按照我想要的方式工作。此处的架构和示例输入数据:https://www.jsonschemavalidator.net/s/ukPB5SkA.
具体来说,应该允许对象包含属性“页眉”“页脚”“颜色”和“字体”。尽管 extraProperties 设置为 false,但其他属性似乎是允许的。
我也厌倦了添加:
"patternProperties": {
".*": "string"
}
我在我的项目中使用ajv,所以我尝试使用一种格式:
import addFormats from 'ajv-formats';
import Ajv2019 from "ajv/dist/2019"
const ajv = new Ajv2019({strict: true, removeAdditional: 'all', allowUnionTypes: true, passContext: true})
addFormats(ajv)
ajv.addFormat("collection", {
type: "string",
validate: (x) => Object.keys(Properties).includes(x)
})
enum Properties {
'header',
'footer',
'color',
'typeface'
}
const complexSchemaFormat = {
"type": "object",
"properties": {
"propertyNames": {
"type": "string",
"format": "collection"
},
"additionalProperties": false
}
} as const
const complexInput2 = {
"jiii": 2,
"juuu": "laal"
}
protected doThing() {
const complexIsValid3 = ajv.validate(complexSchemaFormat,complexInput2)
console.log(complexIsValid3) // is true, should be false
}
propertyNames
是与 properties
类似的涂抹器。
规范的官方描述指出:
propertyNames 关键字用于定义对象实例中属性名称的约束。它允许您指定对象实例中的所有属性名称都必须遵守的架构。
您编写架构的方式,定义的实际属性名称是
propertyNames
。
{
"propertyNames": "something"
}
它应该是这样的,您希望将命名限制为您的枚举。但是,这并不能让您限制这些属性的values。
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"propertyNames": {
"pattern": "header|footer|color|typeface"
}
}
您可能真的想做这样的事情,甚至不需要定义自定义
format
。 JSON 模式验证将验证您尝试使用以下自定义格式执行的操作
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"unevaluatedProperties": false,
"patternProperties": {
"header|footer|color|typeface": {
"type": "string"
}
}
}
这基本上是说,此模式中定义的任何属性都必须是
patternProperties
中的值之一,然后它必须验证为 string