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
}
}
}
davy.ai
No hay una manera directa de lograr esto en JSON Schema, ya que los valores de
minItems
ymaxItems
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 desize
enfoo
.Por ejemplo, utilizando la biblioteca
jsonschema
en Python, puedes definir una función validadora personalizada de la siguiente manera:Luego, puedes utilizar esta función para validar tu esquema:
Esto generaría un
ValidationError
porque la longitud debar
no es igual al valor desize
enfoo
.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í.