|
514 | 514 | <section title="Foreword"> |
515 | 515 | <t> |
516 | 516 | Structural validation alone may be insufficient to allow an application to correctly |
517 | | - utilize certain values. The "format" annotation keyword is defined to allow schema |
| 517 | + utilize certain values. The "format" annotation keyword is defined to allow schema |
518 | 518 | authors to convey semantic information for a fixed subset of values which are |
519 | 519 | accurately described by authoritative resources, be they RFCs or other external |
520 | 520 | specifications. |
521 | 521 | </t> |
522 | 522 |
|
523 | | - <t> |
524 | | - Implementations MAY treat "format" as an assertion in addition to an annotation, |
525 | | - and attempt to validate the value's conformance to the specified semantics. |
526 | | - See the Implementation Requirements below for details. |
527 | | - </t> |
528 | | - |
529 | 523 | <t> |
530 | 524 | The value of this keyword is called a format attribute. It MUST be a string. A |
531 | 525 | format attribute can generally only validate a given set of instance types. If |
|
536 | 530 | <xref target="json-schema">core JSON Schema.</xref> |
537 | 531 | <cref> |
538 | 532 | Note that the "type" keyword in this specification defines an "integer" type |
539 | | - which is not part of the data model. Therefore a format attribute can be |
540 | | - limited to numbers, but not specifically to integers. However, a numeric |
| 533 | + which is not part of the data model. Therefore a format attribute can be |
| 534 | + limited to numbers, but not specifically to integers. However, a numeric |
541 | 535 | format can be used alongside the "type" keyword with a value of "integer", |
542 | 536 | or could be explicitly defined to always pass if the number is not an integer, |
543 | 537 | which produces essentially the same behavior as only applying to integers. |
544 | 538 | </cref> |
545 | 539 | </t> |
546 | 540 |
|
547 | 541 | <t> |
548 | | - Meta-schemas that do not use "$vocabulary" SHOULD be considered to |
549 | | - utilize this vocabulary as if its URI were present with a value of false. |
550 | | - See the Implementation Requirements below for details. |
| 542 | + The current URI for this vocabulary, known as the Format-Annotation vocabulary, is: |
| 543 | + <https://json-schema.org/draft/2020-11/vocab/format-annotation>. The current |
| 544 | + URI for the corresponding meta-schema is: |
| 545 | + <eref target="https://json-schema.org/draft/2020-11/meta/format-annotation"/>. |
| 546 | + Implementing support for this vocabulary is REQUIRED. |
551 | 547 | </t> |
552 | 548 | <t> |
553 | | - The current URI for this vocabulary, known as the Format vocabulary, is: |
554 | | - <https://json-schema.org/draft/2020-11/vocab/format>. |
| 549 | + In addition to the Format-Annotation vocabulary, a secondary vocabulary is available |
| 550 | + for custom meta-schemas that defines "format" as an assertion. The URI for the |
| 551 | + Format-Assertion vocabulary, is: |
| 552 | + <https://json-schema.org/draft/2020-11/vocab/format-assertion>. The current |
| 553 | + URI for the corresponding meta-schema is: |
| 554 | + <eref target="https://json-schema.org/draft/2020-11/meta/format-assertion"/>. |
| 555 | + Implementing support for the Format-Assertion vocabulary is OPTIONAL. |
555 | 556 | </t> |
556 | 557 | <t> |
557 | | - The current URI for the corresponding meta-schema is: |
558 | | - <eref target="https://json-schema.org/draft/2020-11/meta/format"/>. |
| 558 | + Specifying both the Format-Annotation and the Format-Assertion vocabularies is functionally |
| 559 | + equivalent to specifying only the Format-Assertion vocabulary since its requirements |
| 560 | + are a superset of the Format-Annotation vocabulary. |
559 | 561 | </t> |
560 | | - |
561 | 562 | </section> |
562 | 563 |
|
563 | 564 | <section title="Implementation Requirements"> |
564 | 565 | <t> |
565 | | - The "format" keyword functions as an annotation, and optionally as an assertion. |
566 | | - <cref>This is due to the keyword's history, and is not in line with current |
567 | | - keyword design principles.</cref> In order to manage this ambiguity, the |
568 | | - "format" keyword is defined in its own separate vocabulary, as noted above. |
569 | | - The true or false value of the vocabulary declaration governs the implementation |
570 | | - requirements necessary to process a schema that uses "format", and the |
571 | | - behaviors on which schema authors can rely. |
| 566 | + The "format" keyword functions as defined by the vocabulary which is referenced. |
572 | 567 | </t> |
573 | 568 |
|
574 | | - <section title="As an annotation"> |
| 569 | + <section title="Format-Annotation Vocabulary"> |
575 | 570 | <t> |
576 | 571 | The value of format MUST be collected as an annotation, if the implementation |
577 | | - supports annotation collection. This enables application-level validation when |
| 572 | + supports annotation collection. This enables application-level validation when |
578 | 573 | schema validation is unavailable or inadequate. |
579 | 574 | </t> |
580 | 575 | <t> |
581 | | - This requirement is not affected by the boolean value of the vocabulary |
582 | | - declaration, nor by the configuration of "format"'s assertion |
583 | | - behavior described in the next section. |
| 576 | + Implementations MAY still treat "format" as an assertion in addition to an |
| 577 | + annotation and attempt to validate the value's conformance to the specified |
| 578 | + semantics. The implementation MUST provide options to enable and disable such |
| 579 | + evaluation and MUST be disabled by default. Implementations SHOULD document |
| 580 | + their level of support for such validation. |
584 | 581 | <cref> |
585 | | - Requiring annotation collection even when the vocabulary is declared with |
586 | | - a value of false is atypical, but necessary to ensure that the best |
587 | | - practice of performing application-level validation is possible even when |
588 | | - assertion evaluation is not implemented. Since "format" has always been |
589 | | - a part of this specification, requiring implementations to be aware of it |
590 | | - even with a false vocabulary declaration is deemed to not be a burden. |
| 582 | + Specifying the Format-Annotation vocabulary and enabling validation in an |
| 583 | + implementation should not be viewed as being equivalent to specifying |
| 584 | + the Format-Assertion vocabulary since implementations are not required to |
| 585 | + provide full validation support when the Format-Assertion vocabulary |
| 586 | + is not specified. |
591 | 587 | </cref> |
592 | 588 | </t> |
593 | | - </section> |
594 | | - |
595 | | - <section title="As an assertion"> |
596 | | - <t> |
597 | | - Regardless of the boolean value of the vocabulary declaration, |
598 | | - an implementation that can evaluate "format" as an assertion MUST provide |
599 | | - options to enable and disable such evaluation. The assertion evaluation |
600 | | - behavior when the option is not explicitly specified depends on |
601 | | - the vocabulary declaration's boolean value. |
602 | | - </t> |
603 | | - |
604 | 589 | <t> |
605 | | - When implementing this entire specification, this vocabulary MUST |
606 | | - be supported with a value of false (but see details below), |
607 | | - and MAY be supported with a value of true. |
608 | | - </t> |
609 | | - |
610 | | - <t> |
611 | | - When the vocabulary is declared with a value of false, an implementation: |
| 590 | + When the implementation is configured for assertion behavior, it: |
612 | 591 | <list> |
613 | | - <t> |
614 | | - MUST NOT evaluate "format" as an assertion unless it is explicitly |
615 | | - configured to do so; |
616 | | - </t> |
617 | 592 | <t> |
618 | 593 | SHOULD provide an implementation-specific best effort validation |
619 | 594 | for each format attribute defined below; |
|
622 | 597 | MAY choose to implement validation of any or all format attributes |
623 | 598 | as a no-op by always producing a validation result of true; |
624 | 599 | </t> |
625 | | - <t> |
626 | | - SHOULD document its level of support for validation. |
627 | | - </t> |
628 | 600 | </list> |
629 | 601 | <cref> |
630 | 602 | This matches the current reality of implementations, which provide |
|
634 | 606 | validation in the application, which is the recommended best practice. |
635 | 607 | </cref> |
636 | 608 | </t> |
| 609 | + </section> |
637 | 610 |
|
| 611 | + <section title="Format-Assertion Vocabulary"> |
| 612 | + <t> |
| 613 | + When the Format-Assertion vocabulary is declared with a value of true, |
| 614 | + implementations MUST provide full validation support for all of the formats |
| 615 | + defined by this specificaion. Implementations that cannot provide full |
| 616 | + validation support MUST refuse to process the schema. |
| 617 | + </t> |
638 | 618 | <t> |
639 | | - When the vocabulary is declared with a value of true, an implementation |
640 | | - that supports this form of the vocabulary: |
| 619 | + An implementation that supports the Format-Assertion vocabulary: |
641 | 620 | <list> |
642 | 621 | <t> |
643 | | - MUST evaluate "format" as an assertion unless it is explicitly |
644 | | - configured not to do so; |
| 622 | + MUST still collect "format" as an annotation if the implementation |
| 623 | + supports annotation collection; |
| 624 | + </t> |
| 625 | + <t> |
| 626 | + MUST evaluate "format" as an assertion; |
645 | 627 | </t> |
646 | 628 | <t> |
647 | 629 | MUST implement syntactic validation for all format attributes defined |
|
685 | 667 | <t> |
686 | 668 | Implementations MAY support custom format attributes. Save for agreement between |
687 | 669 | parties, schema authors SHALL NOT expect a peer implementation to support such |
688 | | - custom format attributes. An implementation MUST NOT fail |
689 | | - validation or cease processing due to an unknown format attribute. |
690 | | - When treating "format" as an annotation, implementations SHOULD collect both |
691 | | - known and unknown format attribute values. |
| 670 | + custom format attributes. An implementation MUST NOT fail to collect unknown formats |
| 671 | + as annotations. When the Format-Assertion vocabulary is specified, implementations |
| 672 | + MUST fail upon encountering unknown formats. |
692 | 673 | </t> |
693 | 674 | <t> |
694 | 675 | Vocabularies do not support specifically declaring different value sets for keywords. |
|
0 commit comments