JSON 未根据架构进行验证

JSON is not getting validated based on schema

我一定是遗漏了什么,但是下面的 JSON 没有根据架构进行验证。 例如,Java/JavaScript 对象中的必需属性永远不会按照架构强制执行。 (仅供参考 - 每个语言对象都可能有其他属性或嵌套对象)

但是,如果我完全删除定义并直接将每个单独的数组项放在下面,则它有效。

我想使用 'definitions' 并得到 validated.The 原因我必须将所有对象放在定义中,稍后我可能不得不将不同的语言对象放在 oneOf/allOf 中用于其他某些验证检查。

在线查询: Schema and JSON

JSON

{
  "languages": [
    {
      "lang": "Java",
      "trainer": "Peter"
    },
    {
      "lang": "JavaScript",
      "enrolled": "42",
      "available": "5"
    }
  ]
}

和架构

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "languages"
  ],
  "properties": {
    "languages": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object"
      },
      "anyOf": [
        {
          "$ref": "#/definitions/Java"
        },
        {
          "$ref": "#/definitions/JavaScript"
        }
      ]
    }
  },
  "definitions": {
    "Java": {
      "required": [
        "trainer"
      ],
      "properties": {
        "lang": {
          "enum": [
            "Java"
          ]
        },
        "trainer": {
          "type": "string"
        }
      }
    },
    "JavaScript": {
      "required": [
        "enrolled",
        "available"
      ],
      "properties": {
        "lang": {
          "enum": [
            "JavaScript"
          ]
        },
        "enrolled": {
          "type": "string"
        },
        "available": {
          "type": "string"
        }
      }
    }
  }
}

固定模式现在可以使用

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "languages"
  ],
  "properties": {
    "languages": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "anyOf": [
          {
            "$ref": "#/definitions/Java"
          },
          {
            "$ref": "#/definitions/JavaScript"
          }
        ]
      }
    }
  },
  "definitions": {
    "Java": {
      "required": [
        "trainer"
      ],
      "properties": {
        "lang": {
          "enum": [
            "Java"
          ]
        },
        "trainer": {
          "type": "string"
        }
      }
    },
    "JavaScript": {
      "required": [
        "enrolled",
        "available"
      ],
      "properties": {
        "lang": {
          "enum": [
            "JavaScript"
          ]
        },
        "enrolled": {
          "type": "string"
        },
        "available": {
          "type": "string"
        }
      }
    }
  }
}

我自己修好了

我做了什么:我已将 json 对象块放在数组的项目部分下。

我认为 "array" 定义不正确。可以添加到数组中的对象必须在定义项目类型后在 "items" 中引用。像这样:

"languages": {
        "type": "array",
        "minItems": 1,
        "items": {
            "type": "object",
            "anyOf": [
                {"$ref": "#/definitions/Java"},
                {"$ref": "#/definitions/JavaScript"}
            ]
        }
    }