validator tutorial example json jsonschema

tutorial - Esquema JSON sobre el uso de $ ref



json schema types (1)

OK: cada $ref se resuelve en un URI completo. Una vez hecho esto, todas sus preguntas serán respondidas haciendo la siguiente pregunta: ¿Con qué esquema terminaría, si simplemente obtuviera esa URI? Donde está el $ref , cómo se cargó, todo eso es irrelevante, depende completamente de la URI resuelta.

La biblioteca puede tomar algunos accesos directos (como el almacenamiento en caché de documentos, por lo que solo se recuperan una vez, o confían en que un esquema "habla por" otro), pero esos son todos los detalles de la implementación.

Respuesta a la pregunta original:

# no es especial: todos los valores de $ref se resuelven como URI relacionados con el documento actual (o el valor más cercano de "id" , si existe).

Por lo tanto, si no ha usado "id" , entonces # apuntará a la raíz del documento del esquema. Si buscó su esquema en http://example.com/schema , entonces {"$ref": "#"} cualquier lugar que se resuelva en http://example.com/schema# , que es el documento en sí .

Es diferente cuando usas "id" , porque cambia el esquema "base" contra el cual se resuelve el $ref :

{ "type": "array", "items": { "id": "http://example.com/item-schema", "type": "object", "additionalProperties": {"$ref": "#"} } }

En ese ejemplo, $ref resuelve en http://example.com/item-schema# . Ahora, si su configuración de esquema JSON confía en el esquema que ya tiene, entonces puede reutilizar el valor de "elementos".

Sin embargo, el punto es que no hay nada especial en # : solo se resuelve en una URI como cualquier otra.

Respuesta a EDIT 1:

Tu primer ejemplo es correcto.

Sin embargo, su segundo no es, lamentablemente. Esto se debe a la forma en que la resolución de fragmentos funciona para los URI: un fragmento reemplaza completamente a otro. Cuando resuelve el # contra el valor "id" de #/items , no termina con #/items nuevamente, termina con # . Entonces, en su segundo ejemplo, la primera entrada en "anyOf" aún se resolverá en la raíz del documento, al igual que en el primer ejemplo.

Respuesta a EDIT 2:

Suponiendo que el documento se carga desde http://example.com/my-schema , los URI completos de sus dos refs de $ref son:

  • http://example.com/itemSchema#
  • http://example.com/itemSchema#/definitions/schemaArray

Para la primera, la biblioteca puede usar el esquema que ya tiene, pero puede que no. Después de todo, al mirar los URI, http://example.com/my-schema puede no ser confiable para representar con precisión http://example.com/itemSchema .

Para el segundo, eso no va a funcionar, porque "itemSchema" no tiene una sección de "definitions" , por lo que $ref no se resolverá correctamente en absoluto.

Entiendo que $ ref lleva un URI a un esquema json para usar, pero ¿dónde apunta $ ref: "#"? ¿Significa simplemente usar el esquema actual para este nivel de bloque? ¿O significa usar el esquema de nivel raíz definido en el ID de nivel raíz? Gracias

EDITAR: Así que si tengo:

"items": { "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ], "default": {} }

Debido a que carece de un campo de identificación, intentará validar los elementos de la instancia con el esquema raíz primero y luego, si eso falla, intente validarlo con el esquema schemaArray definido en el esquema de definiciones, ¿verdad?

Así que si lo cambio a:

"items": { "id" : "#/items", "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ], "default": {} }

¿Entonces el primer subsquema en cualquier matriz apuntará al esquema de los elementos?

EDITAR # 2: Está bien, así que si tuviera:

"items": { "id" : "itemSchema", "anyOf": [ { "$ref": "#" }, { "$ref": "#/definitions/schemaArray" } ], "default": {} }

y

"stringArray": { "type": "array", "items": { "$ref" : "itemSchema" }, "minItems": 1, "uniqueItems": true }

¿El campo "elementos" de "stringArray" se validaría con el "itemSchema" anterior?

¿También funciona el segundo $ ref en ''anyOf'' yendo a la raíz y luego recorriendo el camino hasta que llegue a ese esquema? ¡Gracias!