json 模式中的 2 个:1 个必需 1 个可选
2 oneOf in json schema: 1 required 1 optional
我有一个 json 模式,当我在必填字段之间使用 2 oneOf 来进行 2 个选择时,它可以工作。但我不知道如何对可选字段做同样的事情。
我的架构:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"a": {
"type": "number"
},
"b": {
"type": "number"
},
"c": {
"type": "number"
},
"d": {
"type": "number"
},
"e": {
"type": "number"
}
},
"required": ["a"],
"oneOf": [
{"required": ["b"]},
{"required": ["c"]}
],
"oneOf": [
{"required": ["d"]},
{"required": ["e"]}
]
}
我如何进行转换以使 d 和 e 可选(但永远不会同时拥有两者)?
这是 gist with my solution, shown in http://jsonschemalint.com。 (非常方便的工具!)
属性 d
和 e
已经定义,并且允许(但不是必需)任意组合。为了使这两个属性互斥,我们说实例必须 not
匹配具有两个属性的模式:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"a": {"type": "number"},
"b": {"type": "number"},
"c": {"type": "number"},
"d": {"type": "number"},
"e": {"type": "number"}
},
"required": ["a"],
"oneOf": [
{"required": ["b"]},
{"required": ["c"]}
],
"not" : {"required" : ["d","e"]}
}
这很好用,但如果您的互斥组中有两个以上的属性,它就会开始变得混乱。例如,如果我们想添加 属性 f
并使其与 d
和 e
互斥,我们必须禁止三种不同的组合:
"not" : {
"anyOf"{
{"required" : ["d","e"]},
{"required" : ["d","f"]},
{"required" : ["e","f"]},
}
}
这是一个更冗长的替代方案,但可以扩展到更大的互斥属性集:
"oneOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]},
{
"not" : {
"anyOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]}
]
}
}
]
每个 属性 添加到组中需要恰好两行。
由于我们的模式现在有两个 oneOf
约束,我们需要使用 allOf
:
组合它们
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"a": {"type": "number"},
"b": {"type": "number"},
"c": {"type": "number"},
"d": {"type": "number"},
"e": {"type": "number"},
"f": {"type": "number"}
},
"required": ["a"],
"allOf": [
{
"oneOf": [
{"required": ["b"]},
{"required": ["c"]}
]
},
{
"oneOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]},
{
"not" : {
"anyOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]}
]
}
}
]
}
]
}
我有一个 json 模式,当我在必填字段之间使用 2 oneOf 来进行 2 个选择时,它可以工作。但我不知道如何对可选字段做同样的事情。
我的架构:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"a": {
"type": "number"
},
"b": {
"type": "number"
},
"c": {
"type": "number"
},
"d": {
"type": "number"
},
"e": {
"type": "number"
}
},
"required": ["a"],
"oneOf": [
{"required": ["b"]},
{"required": ["c"]}
],
"oneOf": [
{"required": ["d"]},
{"required": ["e"]}
]
}
我如何进行转换以使 d 和 e 可选(但永远不会同时拥有两者)?
这是 gist with my solution, shown in http://jsonschemalint.com。 (非常方便的工具!)
属性 d
和 e
已经定义,并且允许(但不是必需)任意组合。为了使这两个属性互斥,我们说实例必须 not
匹配具有两个属性的模式:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"a": {"type": "number"},
"b": {"type": "number"},
"c": {"type": "number"},
"d": {"type": "number"},
"e": {"type": "number"}
},
"required": ["a"],
"oneOf": [
{"required": ["b"]},
{"required": ["c"]}
],
"not" : {"required" : ["d","e"]}
}
这很好用,但如果您的互斥组中有两个以上的属性,它就会开始变得混乱。例如,如果我们想添加 属性 f
并使其与 d
和 e
互斥,我们必须禁止三种不同的组合:
"not" : {
"anyOf"{
{"required" : ["d","e"]},
{"required" : ["d","f"]},
{"required" : ["e","f"]},
}
}
这是一个更冗长的替代方案,但可以扩展到更大的互斥属性集:
"oneOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]},
{
"not" : {
"anyOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]}
]
}
}
]
每个 属性 添加到组中需要恰好两行。
由于我们的模式现在有两个 oneOf
约束,我们需要使用 allOf
:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"properties": {
"a": {"type": "number"},
"b": {"type": "number"},
"c": {"type": "number"},
"d": {"type": "number"},
"e": {"type": "number"},
"f": {"type": "number"}
},
"required": ["a"],
"allOf": [
{
"oneOf": [
{"required": ["b"]},
{"required": ["c"]}
]
},
{
"oneOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]},
{
"not" : {
"anyOf" : [
{"required" : ["d"]},
{"required" : ["e"]},
{"required" : ["f"]}
]
}
}
]
}
]
}