JSONSchema-如果属性为true-则需要另一个字段

时间:2020-01-04 08:45:58

标签: json jsonschema

我想创建一个架构,使其具有属性has_reference时,字段reference存在(如果该字段不存在,则隐式为false)。反之亦然。该架构还有其他字段ab

这是一个有效的实例:

{
    "a": 1, "b": 2
}
{
    "a": 1, "b": 2
    "has_refernce": true, "reference": "bla"
}

但这无效:

{
    "a": 1, "b": 2
    "has_refernce": true
}
{
    "a": 1, "b": 2
    "refernce": "bla"
}

这可能吗?

编辑:我了解正确的设计将是删除“ use_reference”并使用空的“ reference”来指示是否存在引用,但是我可以更改设计

2 个答案:

答案 0 :(得分:3)

如果您正在使用最新(DRAFT-07)版本的架构,则可以利用以下技巧来实现-

- hosts: localhost
  become: yes
  tasks:
    - name: get version
      shell: curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt
      register: version
    - name: install kubectl
      get_url:
        url: "https://storage.googleapis.com/kubernetes-release/release/{{ version.stdout }}/bin/linux/amd64/kubectl"
        dest: /usr/local/bin/
        mode: '0440'

您还可以在架构中使用条件-

    "dependencies": {
      "has_refernce": [
         "reference"
      ],
     "reference": [
         "has_refernce"
      ]
   }

答案 1 :(得分:1)

如果您这样重写,添加“ required”关键字会更容易:

{
    "a": 1, "b": 2,
    "ref" : {
      "has_refernce": true, 
      "reference": "bla"
    }
}

您可以尝试使用“ required”关键字,但只能用于“ ref”内部的元素。您的架构如下所示:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "a": {
      "type": "integer"
    },
    "b": {
      "type": "integer"
    },
    "ref": {
      "type": "object",
      "properties": {
        "has_refernce": {
          "type": "boolean"
        },
        "reference": {
          "type": "string"
        }
      },
    "required" : [ "has_refernce", "reference" ]
    }
  },
  "required": [
    "a",
    "b"
  ]
}

因此仅需要a和b,但是一旦定义了“ ref”,则将同时需要“具有”引用”和“引用”。

希望获得帮助。