jsonschema - validate - Esquema JSON-requiere todas las propiedades
valid schema (3)
El campo required
en el esquema JSON
El esquema JSON presenta los campos de properties
, properties
required
y properties
additionalProperties
. Por ejemplo,
{
"type": "object",
"properties": {
"elephant": {"type": "string"},
"giraffe": {"type": "string"},
"polarBear": {"type": "string"}
},
"required": [
"elephant",
"giraffe",
"polarBear"
],
"additionalProperties": false
}
Validará objetos JSON como:
{
"elephant": "Johnny",
"giraffe": "Jimmy",
"polarBear": "George"
}
Pero fallará si la lista de propiedades no es exactamente elephant, giraffe, polarBear
.
El problema
A menudo copio y pego la lista de properties
en la lista de required
y sufro de errores molestos cuando las listas no coinciden debido a errores tipográficos y otros errores tontos.
¿Hay una manera más corta de denotar que todas las propiedades son necesarias, sin nombrarlas explícitamente?
Dudo que exista una manera de especificar propiedades requeridas que no sean explícitamente nombrarlas en la matriz requerida.
Pero si encuentra este problema muy a menudo, le sugiero que escriba un pequeño script que postprocese su esquema json y agregue automáticamente la matriz necesaria para todos los objetos definidos.
La secuencia de comandos solo tiene que atravesar el árbol de esquema json y, en cada nivel, si se encuentra una palabra clave "propiedades", agregue una palabra clave "requerida" con todas las claves definidas contenidas en las propiedades en el mismo nivel.
Deja que las máquinas hagan las cosas del agujero.
Hago esto en código con una sola línea, por ejemplo, si quiero usar el required
para insert
en una base de datos, pero solo quiero validar contra el esquema al realizar una update
.
prepareSchema(action) {
const actionSchema = R.clone(schema)
switch (action) {
case ''insert'':
actionSchema.$id = `/${schema.$id}-Insert`
actionSchema.required = Object.keys(schema.properties)
return actionSchema
default:
return schema
}
}
Puede usar la propiedad "minProperties" en lugar de nombrar explícitamente todos los campos.
{
"type": "object",
"properties": {
"elephant": {"type": "string"},
"giraffe": {"type": "string"},
"polarBear": {"type": "string"}
},
"additionalProperties": false,
"minProperties": 3
}