es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Schema JSON con if/else y propiedad opcional: { “$schema”: “http://json-schema.org/draft-07/schema#”, “type”: “object”, “properties”: { “propiedad_requerida”: { “type”: “integer” }, “propiedad_opcional”: { “type”: “string” } }, “if”: { “properties”: { “propiedad_requerida”: { “enum”: [1] } } }, “then”: { “properties”: { “propiedad_opcional”: { “type”: “null” } } }, “else”: { “properties”: { “propiedad_opcional”: { “type”: “string” } } } } Este es un ejemplo de un esquema JSON en el cual se incluye una propiedad opcional con una lógica de if/else. El esquema define un objeto con dos propiedades: “propiedad_requerida” de tipo entero y “propiedad_opcional” de tipo cadena. En la cláusula “if”, se comprueba si el valor de “propiedad_requerida” es igual a 1. Si se cumple esta condición, en la cláusula “then” se establece que “propiedad_opcional” debe tener un valor nulo. En caso contrario, en la cláusula “else” se define que “propiedad_opcional” debe ser una cadena. Esto indica que si “propiedad_requerida” no es igual a 1, se espera que exista un valor válido para “propiedad_opcional” de tipo cadena. De esta manera, este esquema permite tener una propiedad opcional que puede tener diferentes tipos dependiendo de otra propiedad requerida.

Mi esquema tiene una propiedad opcional de tipo booleano llamada prepaid. También hay tres propiedades numéricas opcionales. Si se proporciona la propiedad prepaid y su valor es true, entonces quiero que las otras tres propiedades sean obligatorias. Funciona bien si incluyo explícitamente prepaid en el JSON, pero si lo omito por completo, las otras tres aún son obligatorias. Este es mi esquema.

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://example.com/object1638395656.json",
  "type": "array",
  "items": {
    "type": "object",
    "required": [
      "id",
      "name"
    ],
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid"
      },
      "name": {
        "type": "string",
        "minLength": 1
      },
      "overageRate": {
        "type": "number",
        "minimum": 0
      },
      "pointsPerMonth": {
        "type": "number",
        "minimum": 0
      },
      "prepaid": {
        "type": "boolean"
      }
    },
    "if": {
      "properties": {
        "prepaid": {
          "const": true
        }
      }
    },
    "then": {
      "required": [
        "pointsPerMonth",
        "monthlyRate",
        "overageRate"
      ]
    }
  }
}

Además, ¿existe alguna forma de indicar que si prepaid falta o está establecido en falso, esas tres propiedades no deben permitirse en el JSON en absoluto?

Tags:  

Answer

  1. Avatar for davy.ai

    Para hacer que las tres propiedades sean obligatorias solo si la propiedad de prepago está presente y se establece en true, puede modificar la condición “if-then” de la siguiente manera:

    "if": {
      "properties": {
        "prepaid": {
          "const": true
        }
      }
    },
    "then": {
      "required": [
        "pointsPerMonth",
        "monthlyRate",
        "overageRate"
      ]
    },
    "else": {
      "not": {
        "required": [
          "pointsPerMonth",
          "monthlyRate",
          "overageRate"
        ]
      }
    }
    

    La palabra clave “else” se utiliza para especificar las condiciones cuando la condición “if” falla, es decir, cuando la propiedad de prepago falta o se establece en false. En este caso, usamos la palabra clave “not” para prohibir que las tres propiedades estén presentes en el JSON en absoluto.

    El esquema actualizado sería el siguiente:

    {
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "https://example.com/object1638395656.json",
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1
          },
          "overageRate": {
            "type": "number",
            "minimum": 0
          },
          "pointsPerMonth": {
            "type": "number",
            "minimum": 0
          },
          "monthlyRate": {
            "type": "number",
            "minimum": 0
          },
          "prepaid": {
            "type": "boolean"
          }
        },
        "if": {
          "properties": {
            "prepaid": {
              "const": true
            }
          }
        },
        "then": {
          "required": [
            "pointsPerMonth",
            "monthlyRate",
            "overageRate"
          ]
        },
        "else": {
          "not": {
            "required": [
              "pointsPerMonth",
              "monthlyRate",
              "overageRate"
            ]
          }
        }
      }
    }
    

Comments are closed.