如何使用$ ref文件中的AdditionalProperties?

时间:2019-09-30 14:36:51

标签: json jsonschema openapi

ive将我的JSON模式分为两个文件。

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

person.json(保留对person-input.json的引用,但也具有dateUpdate,dateCreated和DateDeleted)。

这将输入与自动生成的日期属性分开。

我不希望任何帖子都能向数据中添加不需要的属性,因此我认为我将使用"additionalProperties": false,问题是如果我在person-input.json文件中使用它,它将不会从person.json文件接受我的“日期”属性。而且,如果我将它放在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
    }
  ]
}

1 个答案:

答案 0 :(得分:4)

additionalProperties不能“透视” allOf这样的涂药器,也不能“透视” $ref的使用。

为解决此问题,您必须在最外/最顶层的架构中对架构进行一些重复,并从所有子架构中删除additionalProperties: false要求。

additionalProperties: false的工作原理是将false(这是一个有效的架构,返回的验证失败)应用于与基于propertiespatternProperties的键不匹配的值SAME模式对象。

  

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

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.6(草稿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"
        }
      ]
    }
  }
}

您可能会问...“嗯,那太疯狂了。您能解决这个问题吗?” -我们做了。它被称为草稿2019-09,并且它是最近才发布的,因此您必须等待实现赶上来。

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