如何在递归 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"}]
}
}
}
}
...
我想为以下递归 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"}]
}
}
}
}
...