【问题标题】:JSON is not getting validated based on schemaJSON 未根据架构进行验证
【发布时间】:2019-10-04 17:09:40
【问题描述】:

我一定是在这里遗漏了一些东西,但是下面的 JSON 没有针对架构进行验证。 例如,Java/JavaScript 对象的 required 属性永远不会按照架构强制执行。 (仅供参考 - 每个语言对象都可能有其他属性或嵌套对象)

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

我想使用“定义”并得到验证。我必须将所有对象放在定义中的原因,后来我可能不得不将不同的语言对象放在 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 中丢失了
  • @VelikiiNehochuha 感谢您的指出。我已经修复了架构。但它仍然不会验证
  • 添加了在线链接以查看上述问题中的实际情况

标签: json jsonschema


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我已经修复了自己

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

    【讨论】:

    • 考虑解释解决问题的方法或删除您的问题 =]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2015-10-23
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    相关资源
    最近更新 更多