我想创建一个递归模式,允许在嵌套结构中使用任意键。基本架构是这样的:
{
"type": "object",
"properties": {
"Age": {
"type": "number"
},
"Name": {
"type": "string"
}
},
"patternProperties": {
".*": {
"$ref": "#"
}
},
"additionalProperties": false
}
现在我可以插入映射到值的任意键,该值再次遵循相同的架构。现在的问题是:我需要强制 Age 和 Name 都存在于每个最深层的对象中,要么直接包含,要么包含在父对象中。 有效期:
{
"level1": {
"level2": {
"Age": 20,
"Name": "test"
}
}
}
{
"level1": {
"level2": {
},
"Age": 20
},
"Name": "test"
}
{
"level1": {
"level2": {
"Age": 20
}
},
"Name": "test"
}
{
"level1": {
"level2": {
"Age": 20
}
},
"level3": {
"Age": 10
},
"Name": "test"
}
无效
{
"level1": {
"level2": {
"Age": 20
}
},
"level3": {
"Name": "test2"
},
"Name": "test"
}
因为 level3 对象本身或父对象中没有“Age”。
如何检查“如果我是最深的物体,那么某个字段是否包含在我或我的任何祖先中”?
简短背景:json应该用作配置文件,其中可以插入多个具体配置。我希望用户能够简单地将通用参数插入到更高层中,然后将它们级联到具体配置中。
问题是你的
patternProperties
.*
也在捕捉 Age
和 Name
。 为了继续使用 patternProperties
,您需要从正则表达式中排除它们。
更好的是,只需删除
patternProperties
并将您的 $ref
子模式放入 additionalProperties
即可接受模式。
{
"type": "object",
"properties": {
"Age": {
"type": "number"
},
"Name": {
"type": "string"
}
},
"additionalProperties": {
"$ref": "#"
}
}