【问题标题】:How can I combine or extend properties in a JSON Schema?如何在 JSON Schema 中组合或扩展属性?
【发布时间】:2018-04-05 18:29:05
【问题描述】:

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

  1. 有没有办法用不同的属性扩展/修补公共属性?
  2. 我可以在对象属性中使用$switch 吗?我知道它在根级别外部使用,但有没有办法在属性内部执行条件?

我试图为此类问题找到任何解决方案,但目前似乎无法解决任何问题。

【问题讨论】:

    标签: javascript jsonschema ajv


    【解决方案1】:

    关于 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 的对象和另一个使用您的扩展架构的对象一起使用,则可以扩展属性。

    【讨论】:

    • 您的 KIND OF 解决方案与我目前所达到的非常接近。在定义properties 之后,我使用anyOf 来引用我需要添加的额外属性。编译时,所有properties(包括引用的properties)看起来好像它们从一开始就加在一起了。
    • 我不确定我是否完全理解,但可以。确保您进行了一些测试以确认架构按预期工作。找到最终解决方案后,请随时将其发布为其他人的答案。回答您自己的问题是一个有效的选择。 (点赞您认为有帮助的答案也很有用=])
    【解决方案2】:

    我最终设法做到的如下:

    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 对象,看起来好像所有内容从一开始就写在一起。

    我已经编写了测试来确认前面的内容。

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多