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

虾米哥 阅读:23 2025-01-19 22:14:33 评论:0

我正在尝试为文档创建 json 模式,其中某个对象中的字段值应根据同一文档中另一个对象中定义的枚举进行验证。
更具体地说,在下面的示例中,我希望能够使用 id 定义“属性”和 values (我应该能够在不同的 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 模式来验证这种结构,但在描述对“属性”对象的内部字段的引用时遇到了麻烦。我还查看了 standard并没有找到实现目标的方法。
是否可以创建一个 json 模式来验证我的 json 文件?

请您参考如下方法:

$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 模式之外实现验证逻辑的某些部分。


标签:json
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号