json-schema v4 如何根据枚举实现枚举?

json-schema v4 how-to implements enums depending on enums?

使用 json-editor, and looking at this answer,我正在尝试执行以下操作,使用 json-schema v4:

使用根 属性 到 select 两个类别之一 ['clothing', 'accessory'],这将确定 material 属性 的枚举值。

我试图解决的案例有多个枚举属性,具体取决于 category 值。

伪代码示例:

{
    "type": "object",
    "Title": "Products",
    "definitions": {
        "clothing": {
            "materials": ["yak", "merino"]
        },
        "accessories": {
            "materials": ["brass", "silver"]
        }
    },
    "properties": {
        "productType": {
            "type": "string",
            "enum": [
                "clothing",
                "accessories"
            ]
        },
        "materials": {
            "type": "array",
            "title": "Materials",
            "items": {
                "type": "string",
                "title": "Material",
                "enum": [
                    {"$ref" : "#definitions/{{productType}}/materials"}
                ]
            }
        }
    } 
}

关于如何构建它有什么建议吗?

在这种情况下,使用 oneOf 子句为第一层定义类型并仅在嵌套层中使用枚举可能更容易。类似于:

"definitions" : {
    "materialType" : {
        "oneOf" : [{
                "$ref" : "#definitions/clothing"
            }, {
                "$ref" : "#definitions/accesories"
            }
        ]
    },
    "clothing" : {
        "materials" : {
            "enum" : ["yak", "merino"]
        }
    },
    "accessories" : {
        "materials" : ["enum" : ["brass", "silver"]]
    }
}

然后你这样消费materialType

"materials": {"$ref":"#definitions/materialType"}

如果您还想在对象实例中对 materialType 进行编码,那么您可以像这样添加另一个 属性 枚举,但我不推荐这样做:

"clothing" : {
    "materials" : {
        "enum" : ["yak", "merino"]
    },
    "kind": {"enum" : ["clothing"]}
}