Как выразить атрибут элемента в «Затем» в JSON-схеме? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть следующая схема JSON:

 {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "myJsonSchema",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "flag": {
      "type": "boolean"
    },
    "myArray": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/ArrayItem"
      }
    }
  },
  "definitions": {
    "ArrayItem": {
      "type": "object",
      "properties": {
        "itemAttribute1": {
          "type": "string",
          "description": ""
        },
        "itemAttribute2": {
          "type": "string",
          "description": ""
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "flag": {
          "const": true
        }
      },
      "then": {
        "myArray": {
          "items": {
            "required": "itemAttribute1"
          }
        }
      }
    }
  ]
}

Я хочу проверить, что, когда флаг установлен в true, тогда поле "itemAttribute" является обязательным. Как мне этого добиться?

Примеры:

Этот JSON должен быть действительным:

{
    "flag" : true,
      "myArray" : [
        {
          "itemAttribute1" : "c",
          "itemAttribute2" : "d"
        }
      ]
}

Хотя этот json не должен быть действительным (поскольку flag = true, itemAttribute1 становится обязательным):

{
    "flag" : true,
      "myArray" : [
        {
          "itemAttribute2" : "d"
        }
      ]
}

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Как объяснил gregsdennis, каждый из if и then принимает в качестве значения схему JSON.Я изменил детали if и then в вашей исходной схеме.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "myJsonSchema",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "flag": {
      "type": "boolean"
    },
    "myArray": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/ArrayItem"
      }
    }
  },
  "definitions": {
    "ArrayItem": {
      "type": "object",
      "properties": {
        "itemAttribute1": {
          "type": "string",
          "description": ""
        },
        "itemAttribute2": {
          "type": "string",
          "description": ""
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "flag": {
            "const": true
          }
        }
      },
      "then": {
        "properties": {
          "myArray": {
            "items": {
              "required": ["itemAttribute1"]
            }
          }
        }
      }
    }
  ]
}
0 голосов
/ 11 июня 2019

Ключевые слова if, then и else принимают в качестве значений полные схемы.Чтобы выразить свойства объекта внутри них, вам нужно вложить имена этих свойств под ключевым словом properties в if и then, если они у вас есть.

Кроме того, если вы не планируете добавлять дополнительные подсхемыпод allOf это не обязательно.

...