【问题标题】:Is XML Schema xs:alternative equivalent available in JSON Schema?XML Schema xs:alternative 是否在 JSON Schema 中可用?
【发布时间】:2014-11-03 23:05:11
【问题描述】:

是否可以在 JSON Schema 中使用替代方案?在 XSD 中,这可以使用 xs:alternative 元素来实现。

例如查看:How to use alternatives in XML Schema 1.1


更新 1:

这是我想使用 JSON 模式描述的示例 JSON:

{
  "actions": [
    {
      "type": "basic",
      "param1": "value"
    },
    {
      "type": "extended",
      "param1": "value",
      "param2": "blah"
    }
  ]
}

要求:

  • actions 可以有任意数量的项目
  • basic 动作必须包含 param1 属性
  • extended 操作必须包含 param1param2 属性

【问题讨论】:

  • 我回答了一个通用的解决方案,但如果你提供一个具体的例子,评估一个解决方案可能会更容易。
  • @jruizaranguren 我已按要求添加了一个具体示例。
  • 从您的示例中,您有一个基本类型(带有一个必需的 param1)和一个可选的 param2。您可以通过将 param1 和 param2 放入属性中来强制执行此操作,并将 param1 设置为 required。有关更复杂的示例,请查看答案中提供的关键字。
  • 不,param2 不是可选的。这就是重点:当需要 type=extended param2 时。无论如何,谢谢你的提示,我会检查 oneOf 和其他选项。
  • 两种类型的 param1 是否相同?我的意思是,存在一些缺乏继承?

标签: jsonschema


【解决方案1】:

自 Draft04 以来有一个类似的机制,具有更好的语义:oneOf、anyOf、allOf 和 not,关键字。

  • oneOf:强制给定元素仅满足模式列表中的一个。
  • anyOf:必须满足至少一个模式列表。
  • allOf:必须满足列表中所有提供的架构。
  • not:不能满足给定的架构。

假设您正在寻找一个独家的“替代品”,这将是一个使用 oneOf 的 json-schema 示例:

{
    "actions" : {
        "type" : "array",
        "items" : {
            "oneOf" : [{
                    " $ref " : "#/definitions/type1 "
                }, {
                    " $ref " : "#/definitions/type2 "
                }
            ]

        }

    },
    " definitions " : {
        " type1 " : {
            " type " : " object ",
                        "properties": {
                                  "param1":{"type":"string"}
                        },
                        "required":["param1"]
        },
        " type2 " : {
            " type " : " object ",
                         "properties": {
                                  "param2":{"type":"string"},
                                  "param3":{"type":"string"}
                        },
                         "required":["param2","param3"]
        }
    }
}

【讨论】:

  • 这看起来很有希望,尽管当我尝试使用“param1”和“param3”验证一个简单对象时,它已成功验证(顺便说一句:我在两个类型定义中都添加了additionalProperties:false)。虽然我不确定这是模式还是验证器问题。我用jsonschemalint.com
  • 是的。 jsonschemalint 使用 Draft03。我的架构是 Draft04。
  • 顺便说一句:如果您能用 JSON Schema Draft04 需要使用 oneOf 语法的语句更新您的答案,我将不胜感激。谢谢!
猜你喜欢
  • 2019-07-22
  • 2013-11-01
  • 2015-04-19
  • 2012-04-08
  • 2020-05-25
  • 2017-06-11
  • 2014-08-02
  • 2013-04-07
  • 2021-04-18
相关资源
最近更新 更多