具有级联必填字段的递归 JSON 架构

问题描述 投票:0回答:1

我想创建一个递归模式,允许在嵌套结构中使用任意键。基本架构是这样的:

{
  "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应该用作配置文件,其中可以插入多个具体配置。我希望用户能够简单地将通用参数插入到更高层中,然后将它们级联到具体配置中。

json recursion jsonschema
1个回答
0
投票

问题是你的

patternProperties
.*
也在捕捉
Age
Name
。 为了继续使用
patternProperties
,您需要从正则表达式中排除它们。

更好的是,只需删除

patternProperties
并将您的
$ref
子模式放入
additionalProperties
即可接受模式。

{
  "type": "object",
  "properties": {
    "Age": {
      "type": "number"
    },
    "Name": {
      "type": "string"
    }
  },
  "additionalProperties": {
    "$ref": "#"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.