【问题标题】:Json schema to validate object's values against content of another object用于根据另一个对象的内容验证对象的值的 Json 模式
【发布时间】:2016-11-22 12:34:29
【问题描述】:

我正在尝试为一个文档创建 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 模式来验证这样的结构,但在描述对“属性”对象的内部字段的引用时遇到了困难。我还查看了standard 并没有找到实现目标的方法。

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

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

    有一个关于$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 schema v4 是不可能的?很高兴知道有人正在研究它!
    • 正确,v4 不可能
    • 实际上,即使使用 $data 也只有部分可能,如果您降低间接级别。我会编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多