Json 有条件地对子对象应用附加属性,但不对引用它的父对象应用附加属性
我希望实现两个模式,其中一个是另一个的数组,我们把这个有效负载称为B,另一个有效负载称为A 问题:父模式需要一个额外的键,而子模式不允许 有效载荷A:Json 有条件地对子对象应用附加属性,但不对引用它的父对象应用附加属性,json,jsonschema,json-schema-validator,Json,Jsonschema,Json Schema Validator,我希望实现两个模式,其中一个是另一个的数组,我们把这个有效负载称为B,另一个有效负载称为A 问题:父模式需要一个额外的键,而子模式不允许 有效载荷A: { "a": "a", "b": "b", "c": "2019-05-01T09:00:00Z" } 使用以下架构实现: { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "item-schema.json", "title": "Indivi
{
"a": "a",
"b": "b",
"c": "2019-05-01T09:00:00Z"
}
使用以下架构实现:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "item-schema.json",
"title": "Individual Item POST",
"description": "",
"type": "object",
"properties": {
"a": {
"type": "string"
},
"b": {
"type": "string"
},
"c": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false,
"required": [
"a",
"b",
"c"
]
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "items-schema.json",
"title": "Multiple Item POST",
"description": "",
"type": "array",
"items": {
"allOf": [
{
"$ref": "item-schema.json"
},
{
"properties": {
"d": {
"type": "string"
}
}
}
]
},
"additionalItems": false
}
有效载荷B:
[
{
"a": "aa",
"b": "bb",
"c": "2019-05-01T10:00:00Z",
"d": "dd"
},
{
"a": "aaa",
"b": "bbb",
"c": "2019-05-01T11:00:00Z",
"d": "ddd"
}
]
使用以下架构实现:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "item-schema.json",
"title": "Individual Item POST",
"description": "",
"type": "object",
"properties": {
"a": {
"type": "string"
},
"b": {
"type": "string"
},
"c": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false,
"required": [
"a",
"b",
"c"
]
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "items-schema.json",
"title": "Multiple Item POST",
"description": "",
"type": "array",
"items": {
"allOf": [
{
"$ref": "item-schema.json"
},
{
"properties": {
"d": {
"type": "string"
}
}
}
]
},
"additionalItems": false
}
我遇到的问题是,虽然有效负载A的验证是正确的,因为它不允许任何无关的密钥,但由于有效负载A的模式,有效负载B是无效的。使用draft-7 JSON模式实现所需的唯一方法是在模式中进行复制 您需要修改
allOf/1
以具有属性:a、b、c:true
(记住,布尔值是模式)并添加附加属性:false
您必须从item-schema.json中删除additionalProperties:false
如果您不能做到这一点,并且需要item-schema.json自己工作,那么我很抱歉:您运气不好,因此必须复制模式,而不是引用它
意识到这不是非常好,我们努力工作(我批准了核心团队其他成员的公关道具!)为draft-8unevaluatedProperties
创建一个新的关键字。你可以在网站上阅读
如果有什么安慰的话,OpenAPI规范也有同样的问题,上面提到的问题对此进行了解释