Json 如何使用$ref文件中的附加属性?

Json 如何使用$ref文件中的附加属性?,json,jsonschema,openapi,Json,Jsonschema,Openapi,我将JSON模式分为两个文件 person input.json(将由输入设置的所有属性。) person.json(保留对person-input.json的引用,但也包含dateUpdate、dateCreated和DateDeleted) 此选项用于将输入与自动生成的日期属性分开 我不希望任何帖子能够将不需要的属性添加到我的数据中,所以我想我会使用“additionalProperties”:false问题是,如果我在person input.json文件中使用它,它将不会接受person

我将JSON模式分为两个文件

person input.json
(将由输入设置的所有属性。)

person.json
(保留对person-input.json的引用,但也包含dateUpdate、dateCreated和DateDeleted)

此选项用于将输入与自动生成的日期属性分开

我不希望任何帖子能够将不需要的属性添加到我的数据中,所以我想我会使用
“additionalProperties”:false
问题是,如果我在
person input.json
文件中使用它,它将不会接受
person.json
文件中的“date”属性。如果我把它放在person.json文件中,它不会阻止添加随机属性。有解决办法吗

所以下面的这个不起作用,我是否错放了
“additionalProperties”:false

person.json

{
  "allOf": [
    {
      "$ref": "./person-input.json"
    },
    {
      "type": "object",
      "properties": {
        "dateCreated": {
        "name": "dateCreated",
        "type": "string",
        "description": "date created",
        "example": "2019-09-02T11:17:41.783Z"
        },
        "dateUpdated": {
          "type": "string",
          "nullable": true,
          "description": "date updated",
          "example": "2019-09-02T11:17:41.783Z"
        },
        "dateDeleted": {
          "type": "string",
          "nullable": true,
          "description": "date deleted",
          "example": "2019-09-02T11:17:41.783Z"
        }
      },
      "additionalProperties": false
    }
  ]
}

附加属性
不能“看穿”像
allOf
这样的治疗探头,也不能“看穿”使用
$ref

为了解决这个问题,您必须在最外层/最顶层模式中复制模式,并从任何子模式中删除
additionalProperties:false
要求

additionalProperties:false
通过将
false
(这是一个有效的架构,返回验证失败)应用到与基于同一架构对象中的
properties
patternProperties
的键不匹配的值来工作

带有“additionalProperties”的验证仅适用于子级
实例名称的值与“属性”中的任何名称都不匹配, 并且不匹配“patternProperties”中的任何正则表达式

(草案-7)

因此,如果需要将所有需要的属性复制到顶级模式中。是的,这不好

通过观察
properties
对象的值是模式这一事实,您可以使它变得更好一些,因此可能只是
true
,允许子模式稍后实际执行验证

下面是我将在接下来的演讲中使用的一个示例:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "title": "MatchMakerExchange format for queries",
  "definitions": {
    "phenotypicFeatures": {
      "type": [
        "array"
      ]
    },
    "genomicFeatures": {
      "type": [
        "array"
      ]
    },
    "geneticsPatient": {
      "properties": {
        "phenotypicFeatures": {
          "$ref": "#/definitions/phenotypicFeatures"
        },
        "genomicFeatures": {
          "$ref": "#/definitions/genomicFeatures"
        }
      },
      "anyOf": [
        {
          "required": [
            "phenotypicFeatures"
          ]
        },
        {
          "required": [
            "genomicFeatures"
          ]
        }
      ]
    },
    "regularPatient": {
      "type": "object",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": [
            "string"
          ]
        }
      }
    }
  },
  "properties": {
    "patient": {
      "additionalProperties": false,
      "properties": {
        "name": true,
        "phenotypicFeatures": true,
        "genomicFeatures": true
      },
      "allOf": [
        {
          "$ref": "#/definitions/regularPatient"
        },
        {
          "$ref": "#/definitions/geneticsPatient"
        }
      ]
    }
  }
}

你可能会问。。。“哦,那太疯狂了。你能修好这个吗?”-我们修好了。它被称为draft
2019-09
,只是最近才发布,所以您必须等待实现的赶上

一个新关键字,
unevaluatedProperties
取决于注释结果,但您仍然需要从子模式中删除
additionalProperties:false