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.

Referencia de tamaño de array en esquema Json

Tengo un esquema JSON con dos entidades Foo y Bar. Foo contiene el campo size y Bar es un arreglo. Quiero que el tamaño del arreglo Bar sea igual a Foo.size. ¿Existe alguna forma de lograr esto?

Mi enfoque es usar una referencia a la definición del size en Foo, pero es un esquema inválido, ya que el validador de esquemas espera un entero después de “minItems” y “maxItems” (utilizo https://www.jsonschemavalidator.net/).

El enfoque es el siguiente:

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "properties": {
    "foo": {"$ref": "#/definitions/Foo"},
    "bar": {"$ref": "#/definitions/Bar"}
  },
  "required": ["foo", "bar"],
  "definitions": {
    "Foo": {
        "type": "object",
        "properties": {
            "size": {"type": "number"}
        },
        "required": ["size"]
    },
    "Bar": {
        "type": "array",
        "minItems": "#/definitions/Foo/properties/size", // inválido
        "maxItems": "#/definitions/Foo/properties/size"  // inválido
    }
  }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    No hay una manera directa de lograr esto en JSON Schema, ya que los valores de minItems y maxItems deben ser enteros y no pueden ser referencias a otros valores.

    Sin embargo, existen algunas soluciones alternativas que se pueden utilizar para lograr un efecto similar. Una estrategia es utilizar una función de validación personalizada que compruebe la longitud del array bar con respecto al valor de size en foo.

    Por ejemplo, utilizando la biblioteca jsonschema en Python, puedes definir una función validadora personalizada de la siguiente manera:

    from jsonschema import validate, ValidationError
    
    def validar_foo_bar(foo, bar):
        if len(bar) != foo['size']:
            raise ValidationError('La longitud de bar debe ser igual al valor de size en foo')
    

    Luego, puedes utilizar esta función para validar tu esquema:

    esquema = {
        "$schema": "https://json-schema.org/draft/2019-09/schema",
        "properties": {
            "foo": {"$ref": "#/definitions/Foo"},
            "bar": {"$ref": "#/definitions/Bar"}
        },
        "required": ["foo", "bar"],
        "definitions": {
            "Foo": {
                "type": "object",
                "properties": {"size": {"type": "number"}},
                "required": ["size"]
            },
            "Bar": {"type": "array"}
        }
    }
    
    foo = {"size": 3}
    bar = [1, 2, 3]
    
    validate(esquema, {"foo": foo, "bar": bar}, validator=validar_foo_bar)
    

    Esto generaría un ValidationError porque la longitud de bar no es igual al valor de size en foo.

    Si bien este enfoque requiere un código adicional, te permite cumplir con la restricción que estás buscando sin tener que modificar el JSON Schema en sí.

Comments are closed.