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
}
]
}
答案 0 :(得分:4)
additionalProperties
不能“透视” allOf
这样的涂药器,也不能“透视” $ref
的使用。
为解决此问题,您必须在最外/最顶层的架构中对架构进行一些重复,并从所有子架构中删除additionalProperties: false
要求。
additionalProperties: false
的工作原理是将false
(这是一个有效的架构,返回的验证失败)应用于与基于properties
或patternProperties
的键不匹配的值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
。