JsonSchema 如果枚举 属性 是几个枚举值之一,则需要 X,否则对于所有其他值,需要 Y

JsonSchema if enum property is one of several enum values, make X required, else for all other values make Y required

我目前有一个 JsonSchema,它有一个具有 12 个值的枚举字段,假设同一对象中的另外两个常规字符串字段,字段 X 和 Y。如果枚举字段的值是 3 个中的 1 个允许的 12 个枚举值,那么我想让 X 成为必需的,否则如果它是其他 9 个枚举值中的任何一个,那么 Y 是必需的。

例如:

    {
       "$schema": "http://json-schema.org/draft-07/schema#",
       "type": "object",
       "properties": {
          "efield": {
             "type": "string",
             "enum": ["n1", "n2", "...", "n12"]
          },
          "x": {
             "type": "string"
          },
          "y": {
             "type": "string"
          }
       },
       "if": {
          "properties": { "efield": { "in": ["n1", "n2", "n3"] } }
       },
       "then": {
          "required": ["x"]
       },
       "else": {
          "required": ["y"]
       }
    }

这是理想情况下的样子,虽然我知道“in”关键字不存在,但我目前能想到的最接近的只是使用“allOf”并为每个枚举列出 12 个 if 语句值以及根据每个值需要哪个字段,感觉有点过头/不雅。

我还查看了“oneOf”并有两个子模式,其中一个 'efield' 具有前 3 个枚举并且需要 x,另一个是 efield 具有其他 9 个枚举并且需要 y,但是验证会抱怨枚举,例如如果我尝试使用来自 9 个枚举的第二个模式的枚举值,它会抱怨该值不在具有 3 个值的第一个模式中...

是否有任何我遗漏的关键字,或执行此用例的任何优雅方式?谢谢

只需使用 enum 而不是您的 in 关键字就可以了: