如何在递归 json 模式中使用参考模式或字符串

How to use a reference schema OR string in recursive json schema

我想为以下递归 json 对象定义架构:

{
  "options": [
    {
      "mode": "A",
      "values": [
        {
          "mode": "B",
          "values": ["hello?"]
        },        
      ]
    }
  ]
}

我正在使用以下架构,但是我不确定如何指定 values 数组的“类型”可以是 option 一个string.

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/product.schema.json",
  "type": "object",
  "properties": {
    "options": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/option"
      }
    }
  },
  "required": [
    "options"
  ],
  "definitions": {
    "option": {
      "type": "object",
      "properties": {
        "mode": {
          "type": "string"
        },
        "values": {
          "type": [
            "array"
          ],
          "items": {
            "$ref": "#/definitions/option"
          }
        }
      },
      "required": [
        "mode",
        "values"
      ]
    }
  }
}

实际上,我想做这样的事情:

"option": {
   "type": "object",
   "properties": {
     "mode": {
       "type": "string"
     },
     "values": {
       "type": [
         "array"
       ],
       "items": {
         "type": ["string", {"$ref": "#/definitions/option"}]
       }
     }
   },
   "required": [
     "mode",
     "values"
   ]
}

正如@jason-desrosiers 指出的那样,我可以使用 anyOf 来实现这一点:

...

{
    "properties":
    {
        "mode":
        {
            "type": "string"
        },
        "values":
        {
            "type": ["array"],
            "items":
            {
                "anyOf": [{"$ref": "#/definitions/option"},{"type": "string"}]
            }
        }
    }
}

...