如何在JSON模式中组合或扩展属性?

时间:2018-04-05 18:29:06

标签: javascript jsonschema ajv

如果我有一个项目数组,并且这些项目共享一些属性并且也有不同的属性。

  1. 有没有办法用不同的扩展/修补公共属性?
  2. 我可以在对象属性中使用$switch吗?我知道它在根级别外部使用,但有没有办法在属性中执行条件?
  3. 我试图找到解决此问题的任何解决方案,但到目前为止似乎无法达成任何目标。

2 个答案:

答案 0 :(得分:0)

关于properties关键字中可以使用的内容:

  

"属性的价值"必须是一个对象。这个的每个值
  对象必须是有效的JSON模式。

https://tools.ietf.org/html/draft-handrews-json-schema-validation-00#section-6.5.4

$switch但是,它不是JSON Schema规范的一部分,所以虽然它在使用ajv时可能有效,但它可能不会为其他任何人工作。

此外,没有办法延长/补丁"不同的共同属性。如果您使用allOf将一个对象与$ref和另一个扩展架构一起使用,则可以使用KIND OF扩展属性。

答案 1 :(得分:0)

我最终设法做的事情如下:

items: {
    type: 'object',
    oneOf: [
        { $ref: '#/definitions/button' },
        { $ref: '#/definitions/select' },
    ],

    properties: {
        name: {
            $ref:`${DEFINITIONS_SCHEMA}#/definitions/non_empty_string`,
           // Normal object properties
        },
    }
}

properties包含普通对象属性。 buttonselect中的定义均以如下属性开头:

button: {
    properties:{
    }
}

当符合架构时,现在将在项目内部有两个properties对象。 AJV将它们合并为一个properties对象,看起来好像都是从头开始写的。

我已经编写了测试以确认之前的内容。