首页 文章

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

提问于
浏览
2

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

更具体地说,在下面的示例中,我希望能够使用 idvalues 定义"properties"(我应该能够在不同的json文件中定义不同的属性) . 然后"objects"应该能够引用这些属性,以便 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 回答

  • 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模式之外实现验证逻辑的某些部分,您可以使用自定义关键字 .

相关问题