使用对象属性键作为 JSON 模式中的枚举

Sim*_*mon 6 enums json jsonschema jsonpointer ajv

我正在尝试使用 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,项目cheese被认为是无效的,因为对象中没有dairy属性groups。我尝试使用以下模式验证这一点:

{
    "$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
}
Run Code Online (Sandbox Code Playgroud)

这会导致enumforgroup由 中的属性值填充groups,但我想要做的是使用 中定义的属性groups

如果我添加一个像 eg 这样的属性groupIds,让它成为在其中找到的所有属性键的数组,groups并在"$data": "/groupIds"它起作用时指定枚举,那么我认为这是一个 JSON 指针问题。

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

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

所以如果我只能得到 JSON 指针来引用一个对象的键而不是它的值,我猜枚举验证就可以了。我想类似的东西"$data": "/groups/.keys""$data": "/groups/$keys"或者类似的,但还没有找到它,而谷歌搜索或阅读规格。有没有这样的事情,或者曾经有人提出过?

esp*_*esp 4

哪有这回事。它\xe2\x80\x99非常接近JSON中的通用表达式,并且可能有一些用例,但没有这样的规范。

\n