Json 有条件地对子对象应用附加属性,但不对引用它的父对象应用附加属性

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

我希望实现两个模式,其中一个是另一个的数组,我们把这个有效负载称为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": "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-8
unevaluatedProperties
创建一个新的关键字。你可以在网站上阅读

如果有什么安慰的话,OpenAPI规范也有同样的问题,上面提到的问题对此进行了解释