假设我们有一个简单的对象,如
{ "key_1": "value_1", "key_2": "value_2"}
有什么办法可以让我的json模式根据键间依赖关系的值来制作,这样就不允许重复使用 value_1
在 key_2
? 我使用的是json schema draft-4。
不允许。
{ "key_1": "value_1", "key_2": "value_1"}
首先:如果键和值都是未知的,这属于 "业务逻辑 "范畴,不在JSON模式规范的范围内,需要独立处理。
根据你的评论,值的数量是有限的(我假设键的数量也是有限的)。这意味着你有几个选择--即使在草案4中。
anyOf
以确保除了一个键之外,所有的键都没有特定的值,最后用 allOf
(对每个数值)。{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"key_1": { "type": "string" },
"key_2": { "type": "string" },
"key_3": { "type": "string" }
},
"allOf": [
{
"anyOf": [
{
"properties":{
"key_1": { "not": { "enum": ["value_1"] } },
"key_2": { "not": { "enum": ["value_1"] } }
}
},
{
"properties":{
"key_1": { "not": { "enum": ["value_1"] } },
"key_3": { "not": { "enum": ["value_1"] } }
}
},
{
"properties":{
"key_2": { "not": { "enum": ["value_1"] } },
"key_3": { "not": { "enum": ["value_1"] } }
}
}
]
},
{
"anyOf": [
{
"properties":{
"key_1": { "not": { "enum": ["value_2"] } },
"key_2": { "not": { "enum": ["value_2"] } }
}
},
{
"properties":{
"key_1": { "not": { "enum": ["value_2"] } },
"key_3": { "not": { "enum": ["value_2"] } }
}
},
{
"properties":{
"key_2": { "not": { "enum": ["value_2"] } },
"key_3": { "not": { "enum": ["value_2"] } }
}
}
]
}
]
}
oneOf
来表示要么没有,要么只有一个键有一个特定的值。对每一个可能的值都这样做,最后将其包裹在 allOf
.小心 required
关键字,以确保相应的键确实存在。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"key_1": { "type": "string" },
"key_2": { "type": "string" },
"key_3": { "type": "string" }
},
"allOf": [
{
"oneOf": [
{
"properties": {
"key_1": { "not": { "enum": ["value_1"] } },
"key_2": { "not": { "enum": ["value_1"] } },
"key_3": { "not": { "enum": ["value_1"] } }
}
},
{
"properties": {
"key_1": { "enum": ["value_1"] }
},
"required": ["key_1"]
},
{
"properties": {
"key_2": { "enum": ["value_1"] }
},
"required": ["key_2"]
},
{
"properties": {
"key_3": { "enum": ["value_1"] }
},
"required": ["key_3"]
}
]
},
{
"oneOf": [
{
"properties": {
"key_1": { "not": { "enum": ["value_2"] } },
"key_2": { "not": { "enum": ["value_2"] } },
"key_3": { "not": { "enum": ["value_2"] } }
}
},
{
"properties": {
"key_1": { "enum": ["value_2"] }
},
"required": ["key_1"]
},
{
"properties": {
"key_2": { "enum": ["value_2"] }
},
"required": ["key_2"]
},
{
"properties": {
"key_3": { "enum": ["value_2"] }
},
"required": ["key_3"]
}
]
}
]
}
可能还有一些更多的组合,例如,列出所有允许的值组合,但你明白了:对于一些键和值来说,这是可以管理的,但很快就会变得笨重--假设你必须手动维护这个。