JSON未基于架构进行验证

时间:2019-10-04 17:09:40

标签: json jsonschema

我必须在这里丢失一些内容,但是下面的JSON并未针对该架构进行验证。 例如,从Java / JavaScript对象获得的required属性永远不会按照架构强制执行。 (仅供参考-每个语言​​对象都可以具有其他属性或嵌套对象)

但是,如果我完全删除了定义并将它们分别直接放在数组项下面,那么它将验证。

我想使用'definitions'并得到验证。之所以必须将所有对象放入定义中,后来可能不得不将不同语言的对象放在oneOf / allOf中,以便进行其他某些验证检查。

在线检查: Schema and JSON

JSON

make_clone

和架构

{
  "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"
        }
      }
    }
  }
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我已经修复了自己

我做了什么:我已将json对象块放置在array的items部分下。