如何在 json 模式的数组中强制执行某个 enumType 至多一个元素的条件

问题描述 投票:0回答:2

我遇到了这个问题,我有一个类似于

的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 模式的当前范围内是否可能,并获得解决方案(如果确实可能)。

jsonschema json-schema-validator
2个回答
1
投票

如果

fruitType
是您在项目中拥有的唯一属性,那么可能将
uniqueItems: true
添加到数组模式中就可以解决问题。

然而,

uniqueItems
的问题在于它会从整体上看待项目,而不仅仅是单个属性。 为此,您需要我的
Array Extensions vocab
中的uniqueKeys之类的东西。 据我所知,它仅在 .Net 中受支持,但如果您的验证器支持自定义关键字,也许您可以自己实现。


0
投票

您需要

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 ... }
]
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.