|
527 | 527 | </t>
|
528 | 528 | </section>
|
529 | 529 |
|
530 |
| - <section title='Schema References With "$ref"'> |
531 |
| - <t> |
532 |
| - The "$ref" keyword is used to reference a schema, and provides the ability to |
533 |
| - validate recursive structures through self-reference. |
534 |
| - </t> |
535 |
| - <t> |
536 |
| - An object schema with a "$ref" property MUST be interpreted as a "$ref" reference. |
537 |
| - The value of the "$ref" property MUST be a URI Reference. |
538 |
| - Resolved against the current URI base, it identifies the URI of a schema to use. |
539 |
| - All other properties in a "$ref" object MUST be ignored. |
540 |
| - </t> |
541 |
| - <t> |
542 |
| - The URI is not a network locator, only an identifier. A schema need not be |
543 |
| - downloadable from the address if it is a network-addressable URL, and |
544 |
| - implementations SHOULD NOT assume they should perform a network operation when they |
545 |
| - encounter a network-addressable URI. |
546 |
| - </t> |
547 |
| - <t> |
548 |
| - A schema MUST NOT be run into an infinite loop against a schema. For example, if two |
549 |
| - schemas "#alice" and "#bob" both have an "allOf" property that refers to the other, |
550 |
| - a naive validator might get stuck in an infinite recursive loop trying to validate |
551 |
| - the instance. |
552 |
| - Schemas SHOULD NOT make use of infinite recursive nesting like this; the behavior is |
553 |
| - undefined. |
554 |
| - </t> |
555 |
| - </section> |
556 |
| - |
557 | 530 | <section title="Base URI and Dereferencing">
|
558 | 531 | <section title="Initial Base URI">
|
559 | 532 | <t>
|
|
581 | 554 | This value SHOULD be normalized, and SHOULD NOT be an empty fragment <#>
|
582 | 555 | or an empty string <>.
|
583 | 556 | </t>
|
584 |
| - <t> |
585 |
| - The root schema of a JSON Schema document SHOULD contain an "$id" keyword with |
586 |
| - a URI (containing a scheme). This URI SHOULD either not have a fragment, or |
587 |
| - have one that is an empty string. |
588 |
| - <!-- All of the standard meta-schemas use an empty fragment in their id/$id values. --> |
589 |
| - <cref> |
590 |
| - How should an "$id" URI reference containing a fragment with other components |
591 |
| - be interpreted? There are two cases: when the other components match |
592 |
| - the current base URI and when they change the base URI. |
593 |
| - </cref> |
594 |
| - </t> |
595 |
| - <t> |
596 |
| - To name subschemas in a JSON Schema document, |
597 |
| - subschemas can use "$id" to give themselves a document-local identifier. |
598 |
| - This is done by setting "$id" to a URI reference consisting |
599 |
| - only of a plain name fragment (not a JSON Pointer fragment). |
600 |
| - The fragment identifier MUST begin with a letter ([A-Za-z]), followed by |
601 |
| - any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons |
602 |
| - (":"), or periods ("."). |
603 |
| - </t> |
604 |
| - <t> |
605 |
| - Providing a plain name fragment enables a subschema to be |
606 |
| - relocated within a schema without requiring that JSON |
607 |
| - Pointer references are updated. |
608 |
| - </t> |
609 |
| - <t> |
610 |
| - The effect of defining a fragment-only "$id" URI reference that neither |
611 |
| - matches the above requirements nor is a valid JSON pointer |
612 |
| - is not defined. |
613 |
| - </t> |
614 |
| - <t> |
615 |
| - For example: |
| 557 | + <section title="Identifying the root schema"> |
| 558 | + <t> |
| 559 | + The root schema of a JSON Schema document SHOULD contain an "$id" keyword with |
| 560 | + a URI (containing a scheme). This URI SHOULD either not have a fragment, or |
| 561 | + have one that is an empty string. |
| 562 | + <!-- All of the standard meta-schemas use an empty fragment in their id/$id values. --> |
| 563 | + </t> |
| 564 | + </section> |
| 565 | + <section title="Changing the base URI within a schema file"> |
| 566 | + <t> |
| 567 | + When an "$id" sets the base URI, the object containing that "$id" and all of |
| 568 | + its subschemas can be identified by using a JSON Pointer fragment starting |
| 569 | + from that location. This is true even of subschemas that further change the |
| 570 | + base URI. Therefore, a single subschema may be accessible by multiple URIs, |
| 571 | + each consisting of base URI declared in the subschema or a parent, along with |
| 572 | + a JSON Pointer fragment identifying the path from the schema object that |
| 573 | + declares the base to the subschema being identified. Examples of this are |
| 574 | + shown in section <xref target="idExamples" format="counter"></xref>. |
| 575 | + </t> |
| 576 | + </section> |
| 577 | + <section title="Location-independent identifiers"> |
| 578 | + <t> |
| 579 | + Using JSON Pointer fragments requires knowledge of the structure of the schema. |
| 580 | + When writing schema documents with the intention to provide re-usable |
| 581 | + schemas, it may be preferable to use a plain name fragment that is not tied to |
| 582 | + any particular structural location. This allows a subschema to be relocated |
| 583 | + without requiring JSON Pointer references to be updated. |
| 584 | + </t> |
| 585 | + <t> |
| 586 | + To name subschemas in a JSON Schema document, |
| 587 | + subschemas can use "$id" to give themselves a document-local identifier. |
| 588 | + This is done by setting "$id" to a URI reference consisting |
| 589 | + only of a plain name fragment (not a JSON Pointer fragment). |
| 590 | + The fragment identifier MUST begin with a letter ([A-Za-z]), followed by |
| 591 | + any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons |
| 592 | + (":"), or periods ("."). |
| 593 | + </t> |
| 594 | + <t> |
| 595 | + The effect of defining a fragment-only "$id" URI reference that neither |
| 596 | + matches the above requirements nor is a valid JSON pointer |
| 597 | + is not defined. |
| 598 | + <cref> |
| 599 | + How should an "$id" URI reference containing a fragment with other components |
| 600 | + be interpreted? There are two cases: when the other components match |
| 601 | + the current base URI and when they change the base URI. |
| 602 | + </cref> |
| 603 | + </t> |
| 604 | + </section> |
| 605 | + <section title="Schema identification examples" anchor="idExamples"> |
616 | 606 | <figure>
|
| 607 | + <preamble> |
| 608 | + Consider the following schema, which shows "$id" being used to identify |
| 609 | + the root schema, change the base URI for subschemas, and assign plain |
| 610 | + name fragments to subschemas: |
| 611 | + </preamble> |
617 | 612 | <artwork>
|
618 | 613 | <![CDATA[
|
619 | 614 | {
|
|
635 | 630 | ]]>
|
636 | 631 | </artwork>
|
637 | 632 | </figure>
|
| 633 | + <t> |
| 634 | + The schemas at the following URI-encoded <xref target="RFC6901">JSON |
| 635 | + Pointers</xref> (relative to the root schema) have the following |
| 636 | + base URIs, and are identifiable by any listed URI in accordance with |
| 637 | + Section <xref target="fragments" format="counter"></xref> above: |
| 638 | + </t> |
| 639 | + <t> |
| 640 | + <list style="hanging"> |
| 641 | + <t hangText="# (document root)"> |
| 642 | + <list> |
| 643 | + <t>http://example.com/root.json</t> |
| 644 | + <t>http://example.com/root.json#</t> |
| 645 | + </list> |
| 646 | + </t> |
| 647 | + <t hangText="#/definitions/A"> |
| 648 | + <list> |
| 649 | + <t>http://example.com/root.json#foo</t> |
| 650 | + <t>http://example.com/root.json#/definitions/A</t> |
| 651 | + </list> |
| 652 | + </t> |
| 653 | + <t hangText="#/definitions/B"> |
| 654 | + <list> |
| 655 | + <t>http://example.com/other.json</t> |
| 656 | + <t>http://example.com/other.json#</t> |
| 657 | + <t>http://example.com/root.json#/definitions/B</t> |
| 658 | + </list> |
| 659 | + </t> |
| 660 | + <t hangText="#/definitions/B/definitions/X"> |
| 661 | + <list> |
| 662 | + <t>http://example.com/other.json#bar</t> |
| 663 | + <t>http://example.com/other.json#/definitions/X</t> |
| 664 | + <t>http://example.com/root.json#/definitions/B/definitions/X</t> |
| 665 | + </list> |
| 666 | + </t> |
| 667 | + <t hangText="#/definitions/B/definitions/Y"> |
| 668 | + <list> |
| 669 | + <t>http://example.com/t/inner.json</t> |
| 670 | + <t>http://example.com/t/inner.json#</t> |
| 671 | + <t>http://example.com/other.json#/definitions/Y</t> |
| 672 | + <t>http://example.com/root.json#/definitions/B/definitions/Y</t> |
| 673 | + </list> |
| 674 | + </t> |
| 675 | + <t hangText="#/definitions/C"> |
| 676 | + <list> |
| 677 | + <t>urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f</t> |
| 678 | + <t>urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f#</t> |
| 679 | + <t>http://example.com/root.json#/definitions/C</t> |
| 680 | + </list> |
| 681 | + </t> |
| 682 | + </list> |
| 683 | + </t> |
| 684 | + </section> |
| 685 | + </section> |
| 686 | + |
| 687 | + <section title='Schema References With "$ref"'> |
| 688 | + <t> |
| 689 | + The "$ref" keyword is used to reference a schema, and provides the ability to |
| 690 | + validate recursive structures through self-reference. |
638 | 691 | </t>
|
639 | 692 | <t>
|
640 |
| - The schemas at the following URI-encoded <xref target="RFC6901">JSON |
641 |
| - Pointers</xref> (relative to the root schema) have the following |
642 |
| - base URIs, and are identifiable by either URI in accordance with |
643 |
| - Section <xref target="fragments" format="counter"></xref> above: |
| 693 | + An object schema with a "$ref" property MUST be interpreted as a "$ref" reference. |
| 694 | + The value of the "$ref" property MUST be a URI Reference. |
| 695 | + Resolved against the current URI base, it identifies the URI of a schema to use. |
| 696 | + All other properties in a "$ref" object MUST be ignored. |
644 | 697 | </t>
|
645 | 698 | <t>
|
646 |
| - <list style="hanging"> |
647 |
| - <t hangText="# (document root)">http://example.com/root.json#</t> |
648 |
| - <t hangText="#/definitions/A">http://example.com/root.json#foo</t> |
649 |
| - <t hangText="#/definitions/B">http://example.com/other.json</t> |
650 |
| - <t hangText="#/definitions/B/definitions/X">http://example.com/other.json#bar</t> |
651 |
| - <t hangText="#/definitions/B/definitions/Y">http://example.com/t/inner.json</t> |
652 |
| - <t hangText="#/definitions/C">urn:uuid:ee564b8a-7a87-4125-8c96-e9f123d6766f</t> |
653 |
| - </list> |
| 699 | + The URI is not a network locator, only an identifier. A schema need not be |
| 700 | + downloadable from the address if it is a network-addressable URL, and |
| 701 | + implementations SHOULD NOT assume they should perform a network operation when they |
| 702 | + encounter a network-addressable URI. |
| 703 | + </t> |
| 704 | + <t> |
| 705 | + A schema MUST NOT be run into an infinite loop against a schema. For example, if two |
| 706 | + schemas "#alice" and "#bob" both have an "allOf" property that refers to the other, |
| 707 | + a naive validator might get stuck in an infinite recursive loop trying to validate |
| 708 | + the instance. |
| 709 | + Schemas SHOULD NOT make use of infinite recursive nesting like this; the behavior is |
| 710 | + undefined. |
654 | 711 | </t>
|
655 |
| - <section title="Internal References"> |
| 712 | + <section title="Loading a referenced schema"> |
| 713 | + <t> |
| 714 | + To differentiate schemas between each other in a vast ecosystem, schemas are |
| 715 | + identified by URI. As specified above, this does not necessarily mean |
| 716 | + anything is downloaded, but instead JSON Schema implementations SHOULD |
| 717 | + already understand the schemas they will be using, including the URIs that |
| 718 | + identify them. |
| 719 | + </t> |
| 720 | + <t> |
| 721 | + Implementations SHOULD be able to associate arbitrary URIs with an arbitrary |
| 722 | + schema and/or automatically associate a schema's "$id"-given URI, depending |
| 723 | + on the trust that the validator has in the schema. Such URIs and schemas |
| 724 | + can be supplied to an implementation prior to processing instances, or may |
| 725 | + be noted within a schema document as it is processed, producing associations |
| 726 | + as shown in section <xref target="idExamples" format="counter"></xref>. |
| 727 | + </t> |
| 728 | + <t> |
| 729 | + A schema MAY (and likely will) have multiple URIs, but there is no way for a |
| 730 | + URI to identify more than one schema. When multiple schemas try to identify |
| 731 | + with the same URI, validators SHOULD raise an error condition. |
| 732 | + </t> |
| 733 | + </section> |
| 734 | + <section title="Dereferencing"> |
656 | 735 | <t>
|
657 | 736 | Schemas can be identified by any URI that has been given to them, including
|
658 |
| - a JSON Pointer or their URI given directly by "$id". |
| 737 | + a JSON Pointer or their URI given directly by "$id". In all cases, |
| 738 | + dereferencing a "$ref" reference involves first resolving its value as a |
| 739 | + URI reference against the current base URI per |
| 740 | + <xref target="RFC3986">RFC 3986</xref>. |
659 | 741 | </t>
|
660 | 742 | <t>
|
661 |
| - Tools SHOULD take note of the URIs that schemas, including subschemas, |
662 |
| - provide for themselves using "$id". This is known as "Internal referencing". |
| 743 | + If the resulting URI identifies a schema within the current document, or |
| 744 | + within another schema document that has been made available to the implementation, |
| 745 | + then that schema SHOULD be used automatically. |
663 | 746 | </t>
|
664 |
| - |
665 | 747 | <t>
|
666 | 748 | For example, consider this schema:
|
667 | 749 | </t>
|
|
678 | 760 | "definitions": {
|
679 | 761 | "single": {
|
680 | 762 | "$id": "#item",
|
681 |
| - "type": "integer" |
| 763 | + "type": "object", |
| 764 | + "additionalProperties": { "$ref": "other.json" } |
682 | 765 | }
|
683 | 766 | }
|
684 | 767 | }
|
|
693 | 776 | <t>
|
694 | 777 | When an implementation then looks inside the <#/items> schema, it
|
695 | 778 | encounters the <#item> reference, and resolves this to
|
696 |
| - <http://example.net/root.json#item> which is understood as the schema |
697 |
| - defined elsewhere in the same document without needing to |
698 |
| - resolve the fragment against the base URI. |
699 |
| - </t> |
700 |
| - </section> |
701 |
| - <section title="External References"> |
702 |
| - <t> |
703 |
| - To differentiate schemas between each other in a vast ecosystem, schemas are |
704 |
| - identified by URI. As specified above, this does not necessarily mean |
705 |
| - anything is downloaded, but instead JSON Schema implementations SHOULD |
706 |
| - already understand the schemas they will be using, including the URIs that |
707 |
| - identify them. |
708 |
| - </t> |
709 |
| - <t> |
710 |
| - Implementations SHOULD be able to associate arbitrary URIs with an arbitrary |
711 |
| - schema and/or automatically associate a schema's "$id"-given URI, depending |
712 |
| - on the trust that the validator has in the schema. |
| 779 | + <http://example.net/root.json#item>, which it has seen defined in |
| 780 | + this same document and can therefore use automatically. |
713 | 781 | </t>
|
714 | 782 | <t>
|
715 |
| - A schema MAY (and likely will) have multiple URIs, but there is no way for a |
716 |
| - URI to identify more than one schema. When multiple schemas try to identify |
717 |
| - with the same URI, validators SHOULD raise an error condition. |
| 783 | + When an implementation encounters the reference to "other.json", it resolves |
| 784 | + this to <http://example.net/other.json>, which is not defined in this |
| 785 | + document. If a schema with that identifier has otherwise been supplied to |
| 786 | + the implementation, it can also be used automatically. |
| 787 | + <cref> |
| 788 | + What should implementations do when the referenced schema is not known? |
| 789 | + Are there circumstances in which automatic network dereferencing is |
| 790 | + allowed? A same origin policy? A user-configurable option? In the |
| 791 | + case of an evolving API described by Hyper-Schema, it is expected that |
| 792 | + new schemas will be added to the system dynamically, so placing an |
| 793 | + absolute requirement of pre-loading schema documents is not feasible. |
| 794 | + </cref> |
718 | 795 | </t>
|
719 | 796 | </section>
|
720 | 797 | </section>
|
|
0 commit comments