Json Schema:仅当深层嵌套对象中存在特定属性时才需要属性

2023-11-29

我需要构建一个 json 模式(草案 4),该模式需要基于另一个嵌套对象中属性的存在的属性。我已经搜索并尝试了很多东西(anyOf、oneOf、not、dependency),但没有运气。

也许这在 json 模式中是不可能的?

这是我的简化架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",  
  "type": "object",
  "required": ["dog"],
  "properties": {
    "dog": {
      "type": "object",
      "required": ["bananas"],
      "properties": {
        "bananas": { "$ref": "bananas.json" },
        "thing": {
          "type": "object",
          "properties": {
            "total": { "type": "string" }
          }
        }
      }
    }
  }
}

这是bananas.json

{
  "$schema": "http://json-schema.org/draft-04/schema#",  
  "type": "object",
  "required": ["banana"],
  "definitions": {
    "non-empty-string": {
        "type": "string",
        "minLength": 1
    }
  },
  "properties": {
    "banana": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "object",
        "required": ["unit"],
        "properties": {
          "unit": { "type": "string" },
          "thing": {
            "type": "object",
            "anyOf": [
              { "required": [ "tax_transfers" ] },
              { "required": [ "tax_retentions" ] }
            ],
            "properties": {
              "tax_transfers": {
                "type": "object",
                "required": ["tax_transfer"],
                "properties": {
                  "tax_transfer": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "object",
                      "properties": {
                        "rate": { "type": "string" }
                      }
                    }
                  }
                }
              },
              "tax_retentions": {
                "type": "object",
                "required": ["tax_retention"],
                "properties": {
                  "tax_retention": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                      "type": "object",
                      "properties": {
                        "rate": { "type": "string" }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

当数组中的一个或多个对象具有“事物”属性(在香蕉 - >香蕉 - >事物)时,我需要这一点。 那么 (dog -> thing) 处的属性“thing”应该是必需的。

任何帮助将非常感激。


你需要两件事来表达你的约束。第一个是“包含”,第二个是“蕴含”。我已经组织了每一个definitions部分。

Contains

The items关键字允许我们要求数组中的所有项目对于模式都有效。如果数组中的所有项目对于模式都无效,那么我们就知道至少有一项是有效的。

{
  "not": {
    "items": { "not": { ... schema ... } }
  }
}

如果您能够升级到 JSON Schema Draft-06,contains添加关键字是为了使这变得更容易。

{
  "contains": { ... schema ... }
}

含义

暗示允许你做类似条件的事情。如果条件为真或约束为真(或两者都为真),则条件模式隐含约束模式。这实际上等于说,如果条件为真,则约束也必须为真。

{
  "anyOf": [
    { "not": { ... condition schema ... } },
    { ... constraint schema ... }
  ]
}

JSON 架构草案 07 添加了if-then-else关键字试图更好地解决这种情况。我个人不喜欢这样做的方式,以至于我会坚持这种事情的暗示模式,但如果你想尝试的话,这里是这样的。

{
  "if": { ... schema ... },
  "then": { ... schema ... },
  "else": { ... schema ... }
}

全部一起

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "required": ["dog"],
  "properties": {
    "dog": {
      "type": "object",
      "required": ["bananas"],
      "properties": {
        "bananas": { "$ref": "bananas.json" },
        "thing": { "type": "object" }
      }
    }
  },
  "allOf": [
    { "$ref": "#/definitions/banana-things-implies-dog-things" }
  ],
  "definitions": {
    "banana-has-things": {
      "properties": {
        "dog": {
          "properties": {
            "bananas": {
              "properties": {
                "banana": {
                  "not": {
                    "items": { "not": { "required": ["things"] } }
                  }
                }
              }
            }
          }
        }
      }
    },
    "banana-things-implies-dog-things": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/banana-has-things" }},
        {
          "properties": {
            "dog": { "required": ["things"] }
          }
        }
      ]
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Json Schema:仅当深层嵌套对象中存在特定属性时才需要属性 的相关文章

  • 基于 JSON 模式中枚举值的属性

    我正在构建一个 json 模式定义 它有一组固定的控件 我目前用enum 但是 并非所有属性都与所有控件相关 我只想要求一个options财产如果controlType dropdown schema http json schema or
  • 如何指定 JSON 对象应采用哪一个 oneOf 项?

    使用Python和jsonschema我正在尝试验证分配ObjA or ObjB等等beta test json alpha beta ObjA 在我的架构中 testschema json beta is oneOf多个项目 每个项目定义
  • 定义 JSON 结构是否需要 JSON 模式?

    我问这个问题是因为我看到当前的 JSON 模式草案 http json schema org 建议采用以下方式拥有 JSON 架构 对于 JSON a abc b 123 草案中提出的模式是这样的 type object propertie
  • 从 JSON 模式生成 C# 类 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在创建一个 C WCF Web 服务 它以 JSON 格式返回大量数据 客户端是一个iPad应用程序 目前正在由另一个团队开发 所以我正在研究规
  • 递归 JSON 架构

    我正在尝试为带有子菜单的菜单创建正确的 JSON 架构 所以我应该从 item 定义一个数组 其中应包含三个项目 1 显示名称 2 URL 和子项 应该是具有相同结构的对象数组 此时我得到了这个 type array additionalP
  • 带有对象列表的 OpenAPI 查询字符串参数

    我正在尝试记录OpenAPI一个查询字符串 看起来像 filtered 0 id code filtered 0 value 12345 并包含具有属性的对象列表id and value My yaml文档如下所示 parameters n
  • 在 JSON 模式中使用对象属性键作为枚举

    我正在尝试使用 JSON 架构验证 JSON 文件 以便找到 损坏的引用 的情况 本质上 我的文件由项目和组组成 每个项目都属于 groups 属性键引用的单个组 如下所示 items banana name Banana group fr
  • JSON 架构:“allof”和“additionalProperties”

    假设我们的模式遵循模式 来自教程here http spacetelescope github io understanding json schema structuring html structuring schema http js
  • 如何根据字段描述的对象类型根据 JSON 模式验证 JSON 对象?

    我有许多对象 消息 需要根据 JSON 模式 draft 04 进行验证 每个对象都保证有一个 type 字段 用于描述其类型 但每种类型都有一组完全不同的其他字段 因此每种类型的对象都需要一个唯一的模式 我看到了几种可能性 但没有一种特别
  • 如何在父级别的必需中引用子属性

    schema https json schema org draft 2019 09 schema id PersonalDetails json type object properties Header type object prop
  • 如何为对象数组编写 JSON 模式?

    我的 JSON 字符串的格式如下 count 3 data a ax 1 b bx 2 c cx 4 The data数组包含很多a and b and c 并且没有其他种类的物体 If count 0 data应该是一个空数组 我在用着h
  • 元模式指定所有属性所需的属性

    我想自定义一个元模式 使得所有属性都需要有一个附加属性 例如 我如何要求所有属性都指定一个 type 那么这个模式应该会失败 schema http json schema org schema title description type
  • 使用 jsonschema 验证键在对象数组中是否具有唯一值?

    如何使用 jsonschema 验证 JSON 在对象数组中 每个对象中的特定键必须是唯一的 例如 验证每个名称 k v 对的唯一性应该失败 test array Name name1 Description unique desc 1 N
  • 根据 swagger 文件验证 json 负载 - json-schema-validator

    我正在尝试根据包含服务协议的 swagger 文件验证 json 有效负载 我正在使用 json schema validator 2 1 7 库来实现此目的 但目前它没有针对指定的模式或最小 最大长度进行验证 Java代码 public
  • 在 JSON 的情况下,当模式推断留给 Spark 时,为什么 Spark 会输出 nullable = true?

    Spark为何显示可空 true 当未指定模式并将其推理留给 Spark 时 shows nullable true for fields which are present in all JSON records spark read j
  • XML 模式 xs:alternative 在 JSON 模式中是否可用?

    是否可以在 JSON Schema 中使用替代方案 在 XSD 中 这可以使用xs alternative元素 例如参见 如何在 XML Schema 1 1 中使用替代方案 https stackoverflow com question
  • 为 ASP.Net Web API 生成 JSON 架构

    我希望为 WebAPI 生成 JSON 架构 包括 XML 注释中的文档 主要是为了我可以将其导入到我们的 API 文档中 使用 apiary io 我已经设法通过添加 swagger 和 swashbuckle 然后在每个服务上使用原始链
  • JSON 模式中的小数精度

    我想让我的 JSON 架构验证发送到我的 REST api 的小数位数不超过两位 从我在最新的 JSON Schema RFC v4 中看到的情况来看 不允许这样做 V1 有一个 maxDecimals 验证器 有谁知道为什么被删除 我有一
  • 如何使用 JSON.net 引用外部文件?

    这是当 JSON net 尝试读取我的 JSON 架构时出现的错误 return JsonSchema Read new JsonTextReader reader 2014 07 15 15 33 42 7011 Fatal Newton
  • 检查 JSON 模式中不同的嵌套属性

    有没有办法在嵌套 JSON 模式中实现相当于 CHECK 约束的 Postgres 假设我们有具有两个属性的数据 每个属性都有嵌套属性 JSON Schema 如何使第一个对象所需的内容依赖于第二个对象 我的真实案例场景是为 GeoJSON

随机推荐