Проверка схемы JSON на основе свойства - PullRequest
0 голосов
/ 25 апреля 2019

Я пытался получить правильную схему JSON. У меня есть свойство boolean, на основе которого я должен определить необходимые свойства. Ниже приведен мой образец JSON, который я хочу завершить при проверке с item3 нет.

{
  "item1": true,
  "item2": "ABC"
}

Это JSON, который я хочу, чтобы проверка прошла

{
  "item1": true,
  "item2": "ABC",
  "item3": {
    "subItem1": "ABC",
    "subItem2": "BAC"
  }
}

Аналогично, если item1 равен false, то проверка должна пройти для обоих вышеупомянутых JSON.

Моя схема JSON для такой же, как показано ниже.

{
    "definitions": {},
    "type": "object",
    "title": "The Root Schema",
    "properties": {
        "item1": {
            "$id": "#/properties/item1",
            "type": "boolean",
            "title": "The Item1 Schema",
            "default": false,
            "examples": [
                true
            ]
        },
        "item2": {
            "$id": "#/properties/item2",
            "type": "string",
            "title": "The Item2 Schema",
            "default": "",
            "examples": [
                "ABC"
            ],
            "pattern": "^(.*)$"
        },
        "item3": {
            "$id": "#/properties/item3",
            "type": "object",
            "title": "The Item3 Schema",
            "required": [
                "subItem1",
                "subItem2"
            ],
            "properties": {
                "subItem1": {
                    "$id": "#/properties/item3/properties/subItem1",
                    "type": "string",
                    "title": "The Subitem1 Schema",
                    "default": "",
                    "examples": [
                        "AAA"
                    ],
                    "pattern": "^(.*)$"
                },
                "subItem2": {
                    "$id": "#/properties/item3/properties/subItem2",
                    "type": "string",
                    "title": "The Subitem2 Schema",
                    "default": "",
                    "examples": [
                        "BAC"
                    ],
                    "pattern": "^(.*)$"
                }
            }
        }
    },
    "required": ["item1"],
    "allOf": [{
        "if": {
            "properties": {
                "item1": {
                    "enum": [
                        true
                    ]
                }
            }
        },
        "then": {
            "required": [
                "item2",
                "item3"
            ]
        },
        "else": {
            "required": [
                "item2"
            ]
        }
    }]
}

Моя проверка всегда терпит неудачу.

Если item1 равно true, subItem2 должно быть обязательным. Если item1 ложно, то item3 не требуется, но все равно должно быть проверено, если включено.

1 Ответ

1 голос
/ 25 апреля 2019

Ваш блок if / then / else работает правильно с точки зрения проверки.

Приведенный вами пример JSON, который вы ожидаете передать, терпит неудачу, поскольку вы требовали, чтобы у item3 было свойство subItem1 и subItem2, но оно не было.

Теперь вы обновили пример JSON, который должен быть передан для правильного item3, содержащего subItem1 и subItem2, проверка проходит с предоставленной вами схемой.


Кроме того, вы хотите,Если я правильно понимаю:

Если item1 имеет значение true, subItem2 должен быть обязательным.Если item1 имеет значение false, item3 не требуется, но все равно должен быть проверен, если он включен.

Переместите схему, которая требует subItem3, из item3 в ваше предложение then.Это сделает так, что subItem3 является «обязательным», только если ваша if схема успешно проверяется (item1 - true)

{
  "definitions": {},
  "type": "object",
  "title": "The Root Schema",
  "properties": {
    "item1": {
      "$id": "#/properties/item1",
      "type": "boolean",
      "title": "The Item1 Schema",
      "default": false,
      "examples": [
        true
      ]
    },
    "item2": {
      "$id": "#/properties/item2",
      "type": "string",
      "title": "The Item2 Schema",
      "default": "",
      "examples": [
        "ABC"
      ],
      "pattern": "^(.*)$"
    },
    "item3": {
      "$id": "#/properties/item3",
      "type": "object",
      "title": "The Item3 Schema",
      "required": [
        "subItem1"
      ],
      "properties": {
        "subItem1": {
          "$id": "#/properties/item3/properties/subItem1",
          "type": "string",
          "title": "The Subitem1 Schema",
          "default": "",
          "examples": [
            "AAA"
          ],
          "pattern": "^(.*)$"
        },
        "subItem2": {
          "$id": "#/properties/item3/properties/subItem2",
          "type": "string",
          "title": "The Subitem2 Schema",
          "default": "",
          "examples": [
            "BAC"
          ],
          "pattern": "^(.*)$"
        }
      }
    }
  },
  "required": [
    "item1"
  ],
  "allOf": [
    {
      "if": {
        "properties": {
          "item1": {
            "enum": [
              true
            ]
          }
        }
      },
      "then": {
        "required": [
          "item2",
          "item3"
        ],
        "properties": {
          "item3": {
            "required": [
              "subItem2"
            ]
          }
        }
      },
      "else": {
        "required": [
          "item2"
        ]
      }
    }
  ]
}
...