首页 文章

在JSON模式中将对象属性键用作枚举

提问于
浏览
3

我正在尝试使用JSON Schema验证JSON文件,以便查找“已损坏的引用”的情况 . 基本上我的文件由项目和组组成,每个项目属于groups属性键引用的单个组,如下所示:

{
    "items": {
        "banana": {
            "name": "Banana",
            "group": "fruits"
        },
        "apple": {
            "name": "Apple",
            "group": "fruits"
        },
        "carrot": {
            "name": "Carrot",
            "group": "vegetables"
        },
        "potato": {
            "name": "Potato",
            "group": "vegetables"
        },
        "cheese": {
            "name": "Cheese",
            "group": "dairy"
        }
    },
    "groups": {
        "fruits": {
            "name": "Fruits"
        },
        "vegetables": {
            "name": "Vegetables"
        }
    }
}

在上面的示例中,项目 cheese 将被视为无效,因为 groups 对象中没有 dairy 属性 . 我试图使用以下架构验证这一点:

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "Food",
    "id": "food",
    "type": "object",
    "properties": {
        "items": {
            "type": "object",
            "patternProperties": {
                "^[A-Za-z0-9-_.:=]+$": {
                    "properties": {
                        "name": {
                            "type": "string",
                            "pattern": "^[A-Za-z- ]+$"
                        },
                        "group": {
                            "pattern": "^[a-z]+$",
                            "enum": {
                                "$data": "/groups"
                            }
                        }
                    }
                }
            }
        },
        "groups": {
            "type": "object",
            "patternProperties": {
                "^[A-Za-z0-9-_]+$": {
                    "properties": {
                        "name": {
                            "type": "string",
                            "pattern": "^[A-Za-z- ]+$"
                        }
                    }
                }
            }
        }
    },
    "additionalProperties": false
}

这有效 groupenumgroups 中的属性值填充,但我想要做的是使用 groups 中定义的属性键 .

如果我添加一个属性,例如 groupIds 并让它成为 groups 中找到的所有属性键的数组,并将枚举指定为 "$data": "/groupIds" 它确实有效,所以我认为这是一个JSON指针问题 .

JSON Schema中的 enum 关键字定义为:

此关键字的值必须是数组 . 这个数组应该至少有一个元素 . 数组中的元素应该是唯一的 .

因此,如果我只能获取JSON指针来引用一个对象's keys rather than its values I guess the enum validation would just work. I'm,就像 "$data": "/groups/.keys""$data": "/groups/$keys" 或类似的东西一样,但在谷歌搜索或阅读规范时却没有找到它 . 有这样的事情还是曾经提出过?

1 回答

  • 3

    哪有这回事 . 它与JSON中的一般表达式非常接近,它可能有一些用例,但没有这样的规范 .

相关问题