Json模式验证-引用子模式

时间:2020-07-27 20:10:15

标签: json schema jsonschema

我正在尝试针对具有以下结构的架构验证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的类型定义为“ generic”,并稍后在$def块之外添加限制。这样,我可以在不同的情况下使用相同的childType,其中name可能不是“ aaa”或“ bbb”。

谢谢!

1 个答案:

答案 0 :(得分:1)

在使用草稿2019-09时,可以将$ref与其他关键字一起使用。 像draft-07之类的早期草稿中不允许这样做。

例如,而不是拥有...

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

您可以拥有...

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

如果要使用多个引用,则需要将它们作为包装在allOf中的子方案来进行。