Como validar um objeto com base no valor do objeto raiz no esquema json?

Oct 08 2020

Desejo validar a data de venda e a disponibilidade do cliente com base no valor do tipo de pedido. (Observação. Eles não estão no mesmo objeto). Existe alguma maneira de validar valores filho com base no valor raiz?

 {
      "type": "object",
      "properties": {
        "Order": {
          "type": "object",
          "properties": {
            "OrderDetails": {
              "type": "object",
              "properties": {
                "OrderType": {
                  "type": "string",
                  "enum": [
                    "Y",
                    "N"
                  ]
                }
              }
            }
          }
        },
        "Sale": {
          "type": "object",
          "properties": {
            "Saledate": {
              "format": "date"/*should be present when OrderType is Y*/
            }
          }
        },
        "Customer": {
          "type": "object",
          "properties": {
            "Avilability": {
              "type": "string",
              "enum": [
                "Y",
                "N"
              ]/*should be present when orderType is Y*/
            }
          }
        }
      }
    }

Respostas

JasonDesrosiers Oct 10 2020 at 18:26

Você pode usar if/ thenpara criar descrever a restrição. O truque é que você precisa adicionar a restrição em um nível alto o suficiente no esquema para cobrir todas as propriedades envolvidas.

{
  ...
  "if": {
    "type": "object",
    "properties": {
      "Order": {
        "type": "object",
        "properties": {
          "OrderDetails": {
            "type": "object",
            "properties": {
              "OrderType": { "const": "Y" }
            },
            "required": ["OrderType"]
          }
        },
        "required": ["OrderDetails"]
      }
    },
    "required": ["Order"]
  },
  "then": {
    "properties": {
      "Sale": { "required": ["Saledate"] },
      "Customer": { "required": ["Availability"] }
    },
    "required": ["Sale", "Customer"]
  }
}