Schéma JSON concernant l'utilisation de $ ref

je comprends que $ref prend une URI à un json schéma à utiliser mais d'où $ref : "#" point? Cela signifie-t-il simplement utiliser le schéma actuel pour ce niveau de bloc? Ou cela signifie-t-il d'utiliser le schéma du niveau racine défini dans l'id du niveau racine? Merci

modifier: Donc, si j'ai:

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

parce qu'il manque un champ id, il va d'abord essayer de valider les éléments de l'instance avec le schéma racine et ensuite, si cela échoue, essayer de le valider avec le schéma schemaArray défini dans les définitions de schéma, non?

Donc, si j'ai à le modifier:

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

alors le premier sous-chème dans n'importe quel tableau pointera vers le schéma d'items lui-même?

EDIT #2: Okay donc si j'avais:

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

et

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

le champ"items "de" stringArray "serait validé par rapport au champ"itemsSchema" ci-dessus?

fait aussi le deuxième $ ref dans' anyOf ' travail en allant à la racine et puis en traversant le chemin jusqu'à ce qu'il frappe que schéma? Merci!

27
demandé sur hunterc 2013-07-11 17:57:23

1 réponses

OK: each $ref est résolu dans un URI complet. Une fois que cela est fait, toutes vos questions sont répondues en posant la question: quel schéma je finirais par avoir, si je récupérais simplement cette URI?$ref est, comment il a été chargé, tout cela est sans importance - c'est entièrement dépend de L'URI résolu.

La bibliothèque prenez quelques raccourcis (comme mettre en cache des documents pour qu'ils ne soient récupérés qu'une seule fois, ou en faire confiance à un schéma de "parler" un autre), mais ce sont tous les détails de mise en œuvre.

réponse à la question originale:

# n'est pas spécial: toutes les valeurs de $ref sont résolus comme URIs par rapport au document actuel (ou la valeur la plus proche de "id", si il y en a un).

Donc, si vous n'avez pas utilisé "id", puis # pointe vers la racine du document de schéma. Si vous avez récupéré votre schéma de http://example.com/schema, puis {"$ref": "#"} partout à l'intérieur qui permettra de résoudre à http://example.com/schema#, qui est le document lui-même.

C'est différent lorsque vous utilisez "id", parce qu'il modifie le schéma de base contre lequel le $ref est résolu:

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

Dans cet exemple,$ref décide de http://example.com/item-schema#. Maintenant, si votre installation JSON Schema fiducies le schéma qu'il a déjà, alors il peut réutiliser la valeur de "items".

cependant, le fait est qu'il n'y a rien spécial sur # - il se résout juste à un URI comme n'importe quel autre.

Réponse à MODIFIER 1:

Votre premier exemple est correct.

cependant, votre deuxième ne l'est malheureusement pas. C'est en raison de la façon dont la résolution des fragments fonctionne pour URIs: un fragment remplace une autre. Lorsque vous résoudre la # contre "id" valeur #/items, vous ne finissent pas avec #/items encore une fois - vous jusqu'à la fin avec #. Donc, dans votre deuxième exemple, la première entrée dans "anyOf" résoudra toujours à la racine du document, tout comme dans le premier exemple.

Réponse à EDIT 2:

en supposant que le document est chargé à partir de http://example.com/my-schema, L'URIs complet de vos deux $refs:

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

pour le premier, la bibliothèque utilisez le schéma qu'il a déjà, mais il pourrait ne pas - après tout, en regardant L'URIs, http://example.com/my-schema peut ne pas être digne de confiance pour représenter avec précision http://example.com/itemSchema.

pour le second - cela ne va pas marcher, parce que le "itemSchema" n'a pas un "definitions" section, de sorte que $ref ne résoudra pas correctement du tout.

33
répondu cloudfeet 2013-07-18 20:54:46