Json模式,用于根据另一个对象的内容验证对象的值

时间:2016-11-22 12:34:30

标签: json jsonschema

我试图为文档创建json模式,其中某个对象中的字段值应该针对同一文档中另一个对象中定义的枚举进行验证。

更具体地说,在下面的示例中,我希望能够定义"属性"使用idvalues(我应该能够在不同的json文件中定义不同的属性)。 那么"对象"应该能够引用这些属性,以便object.properties[i].id必须与其中一个属性的id匹配,object.properties[i].value必须与为该属性定义的枚举值之一匹配。

{
    "properties": [
        {
            "id": "SIZE",
            "values": ["small", "medium", "big"]
        },
        {
            "id": "MATERIAL",
            "values": ["wood", "glass", "steel", "plastic"]
        },
        {
            "id": "COLOR",
            "values": ["red", "green", "blue"]
        }
    ],

    "objects": [
        {
            "name": "chair",
            "properties": [
                {
                    "id": "SIZE",
                    "value": "small"
                },
                {
                    "id": "COLOR",
                    "value": "red"
                }
            ],
        },
        {
            "name": "table",
            "properties": [
                {
                    "id": "MATERIAL",
                    "value": "wood"
                }
            ]
        }
    ]
}

我试图创建json模式来验证这样的结构,但是在描述对" property"的内部字段的引用时却陷入了困境。宾语。我也调查了standard并没有找到实现目标的方法。

是否可以创建一个json模式来验证我的json文件?

1 个答案:

答案 0 :(得分:3)

如果您稍微更改数据结构以删除一个级别的间接,那么$data reference提议几乎允许这样做。这是supported in Ajv(我是作者)。

所以如果您的数据是:

{
    "properties": {
        "SIZE": ["small", "medium", "big"],
        "MATERIAL": ["wood", "glass", "steel", "plastic"],
        "COLOR": ["red", "green", "blue"]
    },
    "objects": {
        "chair": {
            "SIZE": "small",
            "COLOR": "red"
        },
        "table": {
            "MATERIAL": "wood"
        }
    }
}

然后您的架构可能是:

{
    "type": "object",
    "properties": {
        "properties": {
            "type": "object",
            "additionalProperties": {
                "type": "array",
                "items": { "type": "string" }
            } 
        },
        "objects": {
            "type": "object",
            "additionalProperties": {
                "type": "object",
                "properties": {
                    "SIZE": {"enum": {"$data": "3/properties/SIZE"}},
                    "MATERIAL": {"enum": {"$data": "3/properties/MATERIAL"}},
                    "COLOR": {"enum": {"$data": "3/properties/MATERIAL"}}
                }
            }
        }
    }
}

它可以根据所有可能的属性列表动态生成。

使用数据结构,如果验证器支持自定义关键字,或者在JSON模式之外实现验证逻辑的某些部分,您可以使用自定义关键字。