【问题标题】:Json Schema Validation - Referencing Sub SchemaJson Schema Validation - 引用子模式
【发布时间】:2020-11-17 05:23:21
【问题描述】:

我正在尝试根据具有以下结构的架构验证 json 数据:

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://foo.bar/my.schema.json",
  "$def": {
    "parentType": {
      "type": "object",
      "properties": {
        "child": {
          "$ref": "#/$def/childType"
        }
      },
      "required": [
        "child"
      ]
    },
    "childType": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        }
      },
      "required": [
        "name"
      ]
    }
  },
  "type": "object",
  "properties": {
    "parent": {
      "$ref": "#/$def/parentType"
    }
  },
  "required": [
    "parent"
  ]
}

以下是json数据:

{
  "parent": {
    "child": {
      "name": "aaa",
    }  
  }
}

如何通过 json 架构验证确保以下字段 /parent/child/name 的值是 aaa 或 bbb?

我不想对 childType 定义添加限制,因为我想保留 childType“通用”的类型定义,并稍后在 $def 块之外添加限制。这样我可以将相同的 childType 用于不同的场景,其中name 可能不是“aaa”或“bbb”。

谢谢!

【问题讨论】:

  • 这不是不可能做到的,但我不知道它是否会以对你有用的方式完成。你能解释一下你为什么要这样做吗?这有什么用例/要求?实际值是多少?为什么它们仅限于两个字符串?
  • 感谢您的回复。所以我要做的是将$defs 放在一个单独的 JSON 文件(所有“通用”类型)中,并为我要验证的每个场景都有一个单独的 JSON 文件。该场景可能需要“aaa”或“bbb”,并且 childType 的其他“属性”是可选的,而另一个场景需要我验证不同的属性(对于第一种情况是可选的)。这样我可以重用场景特定模式中的类型,而不是到处复制粘贴它们。我希望它澄清。

标签: json schema jsonschema


【解决方案1】:

当您使用草稿2019-09 时,您可以将$ref 与其他关键字一起使用。 这在早期的草稿中是不允许的,例如 draft-07。

例如,而不是...

"properties": {
    "parent": {
      "$ref": "#/$def/parentType"
    }
  },

你可以...

  "properties": {
    "parent": {
      "$ref": "#/$def/parentType",
      "enum": ["aaa", "bbb"]
    }
  }

如果您想使用多个引用,您需要将它们作为封装在 allOf 中的子模式来执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2018-07-05
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多