Json Meta Schema:如何限制另一个Json Schema嵌套对象

问题描述

所以我正在使用Json元架构https://json-schema.org/draft/2019-09/meta/core 使用https://github.com/java-json-tools/json-schema-validator

进一步验证JSONSchema

我有一个要求,我必须限制一个模式,使其不能嵌套对象,例如下面的模式应该无效

{
  "$schema": "http://json-schema.org/draft-07/schema#","$id": "http://example.com/product.schema.json","title": "test","description": "A product from Acme's catalog","type": "object","properties": {
    "productId": {
      "description": "Outer","properties": {
        "lineId": {
          "description": "Outer","type": "object"
        }
      }
    }
  }
}

由于productId一个对象,并且它还有另一个对象lineId,所以productId只能有字符串或数字字段,而不能有对象, 如何扩展MetaSchema以强制执行此操作。 感谢您的帮助

解决方法

您的问题存在版本不一致的地方,但是我将假设使用草稿04,因为您使用的验证程序最多支持草稿04。如果您需要对其他草稿执行此操作,则该过程将在-07草稿中类似。草稿2019-09将会更加复杂。

  1. 制作04草案元模式的副本
  2. 删除子方案中不希望包含的任何内容,包括“对象” type和与对象相关的任何关键字,例如properties
  3. id更改为https://my-project.com/nested-meta-schema之类的独特内容。
  4. 再制作一份草案04元模式
  5. 将所有递归引用({ "$ref": "#" })替换为对刚创建的架构({ "$ref": "https://my-project.com/nested-meta-schema" })的引用
  6. 将第二个架构的id更改为https://my-project.com/flat-meta-schema之类的独特名称。
  7. 对于要根据元模式验证的任何模式,请将$schema更改为您提供的第二个元模式的ID。

请注意,并非所有的实现都支持自定义元方案,因此您的工作量可能会有所不同。