【发布时间】:2018-04-05 18:29:05
【问题描述】:
如果我有一个项目数组,并且这些项目共享一些属性并且也有不同的属性。
- 有没有办法用不同的属性扩展/修补公共属性?
- 我可以在对象属性中使用
$switch吗?我知道它在根级别外部使用,但有没有办法在属性内部执行条件?
我试图为此类问题找到任何解决方案,但目前似乎无法解决任何问题。
【问题讨论】:
标签: javascript jsonschema ajv
如果我有一个项目数组,并且这些项目共享一些属性并且也有不同的属性。
$switch 吗?我知道它在根级别外部使用,但有没有办法在属性内部执行条件?我试图为此类问题找到任何解决方案,但目前似乎无法解决任何问题。
【问题讨论】:
标签: javascript jsonschema ajv
关于 properties 关键字中可以使用的内容:
“属性”的值必须是一个对象。 this的每个值
对象必须是有效的 JSON 架构。
https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-00#section-6.5.4
但是,$switch 不是 JSON Schema 规范的一部分,因此虽然它在使用 ajv 时可能有效,但可能不适用于其他任何人。
此外,没有办法用不同的属性“扩展/修补”公共属性。如果您将 allOf 与一个使用 $ref 的对象和另一个使用您的扩展架构的对象一起使用,则可以扩展属性。
【讨论】:
properties 之后,我使用anyOf 来引用我需要添加的额外属性。编译时,所有properties(包括引用的properties)看起来好像它们从一开始就加在一起了。
我最终设法做到的如下:
items: {
type: 'object',
oneOf: [
{ $ref: '#/definitions/button' },
{ $ref: '#/definitions/select' },
],
properties: {
name: {
$ref:`${DEFINITIONS_SCHEMA}#/definitions/non_empty_string`,
// Normal object properties
},
}
}
properties 包含普通对象属性。 button 或 select 中的定义以如下属性开头:
button: {
properties:{
}
}
当模式被编译时,现在将是两个 properties 对象内的项目。 AJV 将它们合并为一个 properties 对象,看起来好像所有内容从一开始就写在一起。
我已经编写了测试来确认前面的内容。
【讨论】: