tutorial - ¿Cómo(si es posible) definir en el esquema JSON una propiedad de elementos de matriz debe ser única?
json schema tutorial (3)
Dado el siguiente esquema JSON, es posible indicar que la propiedad "nombre" debe ser única (es decir, NO debe haber dos elementos con el mismo "nombre" en la matriz de "elementos".
{
"root":{
"type":"object",
"properties": {
"elements": {
"type":"array",
"minItems": 1,
"items":{
"type":"object",
"properties":{
"name": {
"type":"string",
"title":"Element Name",
"minLength":3,
},
"url": {
"type":"string",
"title":"Some URL"
}
}
}
}
}
}
}
Intenté usar la palabra clave uniqueItems pero parece que fue diseñada para listas simples de valores.
No, no es posible. De los documentos, json-schema: ... un formato basado en JSON para definir la estructura de los datos JSON.
Es bastante limitado para realizar la validación de valores de datos porque no es el propósito de la norma. Muchas personas han preguntado esto antes porque es común solicitar un tipo de función de "identificación única". Desafortunadamente para aquellos que lo necesitan, el esquema json no le proporciona eso.
Por lo tanto, si desea garantizar la exclusividad, su única opción es tener "nombre" como claves de propiedad en lugar de valores de propiedad.
Si la refactorización de la estructura de datos es una opción, el siguiente enfoque puede ser útil:
- Reemplace la matriz por un mapa. Esto se puede lograr fácilmente mediante el uso de un objeto con
patternProperties
. El patrón es una expresión regular. Cualquier objeto que coincida con el patrón será validado contra el esquema de la propiedad del patrón. Un patrón que coincide con cualquier cadena> = 3 caracteres se ve así:"....*"
, pero parece que siempre está implícito un".*"
final, así que"..."
funciona. - Agregar
minLength:3
adicionales: falso es un paso adicional para imponer su restricción (minLength:3
). - Para imponer al menos un elemento en su mapa (estaba usando
minItems:1
para su matriz), reemplaceminItems
porminProperties
.
... resultando en el siguiente esquema:
"root": {
"type": "object",
"properties": {
"elements": {
"type": "object",
"patternProperties": {
"...": {
"type": "object",
"properties": {
"url": {
"type": "string"
}
}
}
},
"additionalProperties": false,
"minProperties": 1
}
}
}
Si un documento como el siguiente (extracto) coincide con su esquema anterior,
"elements": [
{
"name": "abc",
"url": "http://myurl1"
},
{
"name": "def",
"url": "http://myurl2"
},
{
"name": "ghij",
"url": "http://myurlx"
}
]
... un documento como ese (extracto) coincidirá con el nuevo esquema:
"elements": {
"abc": {
"url": "http://myurl1"
},
"def": {
"url": "http://myurl2"
},
"ghij": {
"url": "http://myurlx"
}
}
Si su caso de uso puede manejar la sobrecarga adicional, puede aplicar una transformación en el documento para generar un documento reducido, y luego aplicar la validación nuevamente con un mini esquema separado en el documento reducido.
Aquí hay algunos enlaces con información sobre las herramientas de transformación de Json:
El manejo de su caso de ejemplo sería muy sencillo en JSONata.