我遇到了这个问题,我有一个类似于
的json模式{
"$schema" : "https://json-schema.org/draft-07/schema",
"type" : "object",
"title" : "salad",
"properties":
{
"fruits" : {
"type" : "array",
"items": {
"$ref": "classpath:schema/fruit.json"
}
}
}
这是水果 json
{
"$schema" : "https://json-schema.org/draft-07/schema",
"type" : "object",
"title" : "fruit",
"properties":
{
"fruitType" : {
"enum": [
"bitter",
"tangy",
"sweet",
"sour"
]
}
}
}
我如何确保沙拉中每种类型最多有一种水果,即苦的、甜的……。
我尝试过浏览文档和各种 json 模式论坛,我想知道这在 json 模式的当前范围内是否可能,并获得解决方案(如果确实可能)。
如果
fruitType
是您在项目中拥有的唯一属性,那么可能将 uniqueItems: true
添加到数组模式中就可以解决问题。
然而,
uniqueItems
的问题在于它会从整体上看待项目,而不仅仅是单个属性。 为此,您需要我的Array Extensions vocab中的
uniqueKeys
之类的东西。 据我所知,它仅在 .Net 中受支持,但如果您的验证器支持自定义关键字,也许您可以自己实现。
您需要
contains
和 maxContains
关键字,但在 Draft-07 中没有 maxContains
。 maxContains
于2019-09添加。不幸的是,在 Draft-07 中无法模拟 maxContains
。这是用带有 maxContains
的方言表达的方式。
"allOf": [
{
"contains": {
"properties": {
"fruitType": { "const": "bitter" }
},
"required": ["fruitType"]
},
"maxContains": 1
},
{
"contains": {
"properties": {
"fruitType": { "const": "tangy" }
},
"required": ["fruitType"]
},
"maxContains": 1
},
{ ... same for sweet ... },
{ ... same for sour ... }
]