Items 对象应该具有相等的 属性

Items object should have equal property

我有一个 JSON 这样的:

{
  "result": [
    {
      "name": "Adam",
      "age": 22
    },
    {
      "name": "John"
    },
    {
      "name": "Justin",
      "age": 25
    }
  ]
}

和架构:

{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com/object1607582431.json",
  "title": "Root",
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "$id": "#root/result",
      "title": "Result",
      "type": "array",
      "default": [],
      "items": {
        "$id": "#root/result/items",
        "title": "Items",
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "$id": "#root/result/items/name",
            "title": "Name",
            "type": "string",
            "default": "",
            "pattern": "^.*$"
          },
          "age": {
            "$id": "#root/result/items/age",
            "title": "Age",
            "type": "integer",
            "default": 0
          }
        }
      }
    }
  }
} 

这里age是可选的属性。如果一个对象中存在可选的 属性,那么我很难应用规则,那么它应该存在于该集合中的所有对象中。有没有可用的选项?

这实际上是 if/then 构造的一个非常好的用例,它确实无法通过使用像 switch 语句一样的 oneOf 来复制。 (干得好。)

您需要将 if/then 构造添加到 results 属性 子模式。如果 if 通过,则 then 也必须适用。

"result": {
  ...,
  "if": {
    "contains": { "required": [ "age" ] }    // 1
  },
  "then": {
    "items": { "required": [ "age" ] }       // 2
  }
}
  1. 如果 result 对象 包含 具有 age 属性,
  2. 的项目
  3. 要求 所有 项具有 age 属性。

编辑

完整架构:

{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com/object1607582431.json",
  "title": "Root",
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "$id": "#root/result",
      "title": "Result",
      "type": "array",
      "default": [],
      "if": { "contains": { "required": [ "age" ] } },
      "then": { "items": { "required": [ "age" ] } },
      "items": {
        "$id": "#root/result/items",
        "title": "Items",
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "$id": "#root/result/items/name",
            "title": "Name",
            "type": "string",
            "default": "",
            "pattern": "^.*$"
          },
          "age": {
            "$id": "#root/result/items/age",
            "title": "Age",
            "type": "integer",
            "default": 0
          }
        }
      }
    }
  }
}

实例:

{
  "result": [
    {
      "name": "one"
    },
    {
      "name": "two",
      "age": 5
    },
    {
      "name": "three"
    }
  ]
}

删除 age 属性 或将其添加到其他项目以使架构通过。