0

我知道“命名空间”不是正确的术语,但我很难找到在 json 模式文档或在线解释的这个用例。

我将 json 模式用于 helm 子图。不涉及 helm 细节,这意味着这个模式将用于验证一个看起来像这样的 yaml 文档(在子图表自己的项目中):

# values.yaml in mysubchart
propOne:
 derp: 123
 herp: abc

还有看起来像这样的 yaml 文档(在父图表项目中):

# values.yaml in mysubchart
mysubchart:
    propOne:
     derp: 123
     herp: abc

所以我有两个文档要使用相同的架构进行验证。唯一的区别是其中一个文档有一个顶级字段,所有内容都嵌套在 ( mysubchart:)

是否可以支持具有相同 json 架构的两个文档?Helm 将毫无问题地使用 helm lint 验证模式,但我也希望用户能够将他们的编辑器指向我发布的 json 模式,以验证父图表中的值 yamls 并获得自动完成等。

编辑

我试过这个,但它不验证任何一个 yaml 文档:

{
    "$defs": {
        "mychart": {
            "$schema": "http://json-schema.org/schema#",
            "title": "test",
            "description": "test",
            "type": "object",
            "required": [
                "propOne",
                "propTwo"
            ],
            "properties": {
                "propOne": {
                    "description": "sdkfjlsdfjlksdjf",
                    "type": "string"
                },
                "propTwo": {
                    "description": "sdkfjlsdfjlksdjf",
                    "type": "string"
                },
            }
        },
    },
    "oneOf": [
        {
            "$ref": "#/$defs/mychart"
        },
        {
            "properties": {
                "mychart": {
                    "$defs": "#/$defs/mychart"
                }
            }
        }
    ]
}

看起来这适用于验证我的第一个 yaml 文档:

"anyOf": [
    {
        "$ref": "#/$defs/mychart"
    }
] 

但是添加第二个元素properties来尝试验证第二个文档搞砸了,而且都没有正确验证

这很有效,我错过了配置的必需:mysubchart 部分

4

1 回答 1

0

您可以将多个模式与 结合起来oneOf,并将公共元素移动到两个模式引用的定义中:

  $defs:
    chart:
      type: object
      required: [ propOne ]
      properties:
        propOne:
          required: [ derp, herp ]
          properties:
            derp:
              type: integer
            herp:
              type: string
  type: object
  oneOf:
  - $ref: '#/$defs/chart'
  - required: [ mysubchart ]
    properties:
      mysubchart:
        $defs: '#/$defs/chart'

如果您使用的是仅支持 Draft7 或更早版本的实现,则更$defs改为definitions.

https://json-schema.org/understanding-json-schema/reference/combining.html介绍了组合模式。

于 2021-11-20T21:38:59.043 回答