Python jsonschema无法验证字符串的枚举

时间:2014-09-18 15:17:46

标签: python json enums jsonschema

所以,我试图为一组轴约束定义一个模式。因此,我想限制"轴"的可能值。元素到[" x"," y"," z"]。

这是我当前的样本及其输出。

JSON:

{
    "name_patterns": [
        {
            "regex": "block[_-]?([\\d]*)",
            "class": "block",
            "id_group": 1
        }
    ],

    "relationships": [
        {
            "src_class": "block",
            "dst_class": "block",
            "constraints": {
                "axis": "x"
            }
        }
    ]
}

架构:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "name_patterns": {"type":  "array",
                          "items": { "$ref": "#/definitions/name_entry" } },
        "relationships": {"type":  "array",
                          "items": { "anyof": [ {"$ref": "#/definitions/relation"} ] } }
    },

    "definitions": {
        "name_entry": {
            "type": "object",
            "properties": {
                "regex": {"type": "string"},
                "class": {"type": "string"},
                "id_group": {"type": "number"}
            },
            "required": ["regex", "class"]
        },
        "relation": {
            "type": "object",
            "properties": {
                "src_class": {"type": "string"},
                "dst_class": {"type": "string"},
                "constraints": {
                    "type": "object",
                    "properties": {
                        "axis": {
                            "enum": ["x", "y", "z"]
                        }
                    },
                    "required": ["axis"]
                }
            },
            "required": ["src_class", "dst_class", "constraints"]
        }

    }
}

如何修复我的架构以拒绝枚举器中未指定的值?

1 个答案:

答案 0 :(得分:4)

您的架构语法略有不同。

首先,您需要将属性定义放在properties

{
    "properties": {
        "axis": {...}
    }
}

其次,type定义了类型(例如"string"),但您在此处不需要它。 enum应该直接位于"axis"架构中:

{
    "properties": {
        "axis": {
            "enum": ["x", "y", "z"]
        }
    }
}