json - 2 oneOf 在 json 模式 : 1 required 1 optional

标签 json schema field optional

我有一个 json 模式,当我使用 2 oneOf 在必填字段之间进行 2 个选择时,该模式有效。但我不知道如何对 optional 字段做同样的事情。

我的架构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {
      "type": "number"
    },
    "b": {
      "type": "number"
    },
    "c": {
      "type": "number"
    },
    "d": {
      "type": "number"
    },
    "e": {
      "type": "number"
    }
  },
  "required": ["a"],
  "oneOf": [
    {"required": ["b"]},
    {"required": ["c"]}
  ],
  "oneOf": [
    {"required": ["d"]},
    {"required": ["e"]}
  ]
}

我怎样才能转换为 d 和 e optional (同时永远不要同时拥有两者)?

最佳答案

这是一个 gist with my solution ,显示在 http://jsonschemalint.com . (非常方便的工具!)

属性de已经定义,并且允许(但不是必需)以任何组合形式存在。为了使这两个属性互斥,我们说实例必须not匹配具有两个属性的模式:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {"type": "number"},
    "b": {"type": "number"},
    "c": {"type": "number"},
    "d": {"type": "number"},
    "e": {"type": "number"}
  },
  "required": ["a"],
  "oneOf": [
      {"required": ["b"]},
      {"required": ["c"]}
    ],
  "not" : {"required" : ["d","e"]}
}

这很好用,但如果您的互斥组中有两个以上的属性,它就会开始变得困惑。例如,如果我们想添加属性 f并使其与 d 互斥和 e ,我们必须禁止三种不同的组合:
  "not" : {
    "anyOf"{
      {"required" : ["d","e"]},
      {"required" : ["d","f"]},
      {"required" : ["e","f"]},
    }
  }

这是一个更冗长的替代方案,但可以扩展到更大的互斥属性集:
  "oneOf" : [
    {"required" : ["d"]},
    {"required" : ["e"]},
    {"required" : ["f"]},
    {
      "not" : {
        "anyOf" : [
          {"required" : ["d"]},
          {"required" : ["e"]},
          {"required" : ["f"]}
        ]
      }  
    }
  ]

添加到组中的每个属性正好需要两行。

由于我们的架构现在有两个 oneOf约束,我们需要使用 allOf 组合它们:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {"type": "number"},
    "b": {"type": "number"},
    "c": {"type": "number"},
    "d": {"type": "number"},
    "e": {"type": "number"},
    "f": {"type": "number"}
  },
  "required": ["a"],
  "allOf": [
    {
      "oneOf": [
          {"required": ["b"]},
          {"required": ["c"]}
        ]
    },
    {
      "oneOf" : [
        {"required" : ["d"]},
        {"required" : ["e"]},
        {"required" : ["f"]},
        {
          "not" : {
            "anyOf" : [
              {"required" : ["d"]},
              {"required" : ["e"]},
              {"required" : ["f"]}
            ]
          }  
        }
      ]
    }
  ]
}

关于json - 2 oneOf 在 json 模式 : 1 required 1 optional,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41146125/

相关文章:

c# - 使用 JSON.NET 实现自定义日期时间转换器

objective-c - COCOA 中的 JSON(使用 YAJL)

xml - 向位于 XML 架构中多个子元素内的元素添加唯一 id

使用模式的 python json 响应

linq-to-sql - 为什么 LinqPad 创建字段而不是属性?

java - jackson 序列号 : Unwrap collection elements using

java - 如何命名Java变量 "public"

postgresql - 如何在模式之间同步 PostgreSQL 数据库结构

python - mysql表中的时间列

c - 在循环中使用变量访问相似的结构