JSON Schema中是否有等效于XML Schema xs:alternative的功能?

4

JSON Schema中是否可以使用alternative呢?在XSD中,可以使用xs:alternative元素实现这一点。

例如,参见:如何在XML Schema 1.1中使用alternatives


更新1:

以下是我想用JSON schema描述的示例JSON:

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

要求:

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

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

3
自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)。虽然我不确定这是模式还是验证器问题。我使用了http://jsonschemalint.com/。 - begie
是的,它是这样的。jsonschemalint使用draft03。我的模式是draft04。 - jruizaranguren
顺便提一下:如果您能更新您的答案并声明需要使用oneOf语法,JSON Schema draft04将不可或缺。谢谢! - begie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接