<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vasters-json-structure-core-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>JSON Structure: Core</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-core-00"/>
    <author fullname="Clemens Vasters">
      <organization>Microsoft Corporation</organization>
      <address>
        <email>clemensv@microsoft.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 66?>

<t>This document specifies JSON Structure, a data structure definition language
that enforces strict typing, modularity, and determinism. JSON Structure
describes JSON-encoded data such that mapping to and from programming languages
and databases and other data formats is straightforward.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://json-structure.github.io/core/draft-vasters-json-structure-core.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vasters-json-structure-core/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/json-structure/core"/>.</t>
    </note>
  </front>
  <middle>
    <?line 73?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies <em>JSON Structure</em>, a data structure definition language
that enforces strict typing, modularity, and determinism. <em>JSON Structure</em>
documents (schemas) describe JSON-encoded data such that mapping JSON encoded
data to and from programming languages and databases and other data formats
becomes straightforward.</t>
      <t><em>JSON Structure</em> is extensible, allowing additional features to be layered on
top. The core language is a data-definition language.</t>
      <t>The "Validation" and "Conditional Composition" extension specifications add
rules that allow for complex pattern matching of <em>JSON Structure</em> documents
against JSON data for document validation purposes.</t>
      <t>Complementing <em>JSON Structure</em> are a set of extension specifications that extend
the core schema language with additional, <bcp14>OPTIONAL</bcp14> features:</t>
      <ul spacing="normal">
        <li>
          <t><em>JSON Structure: Import</em> <xref target="JSTRUCT-IMPORT"/>: Defines a mechanism for importing
external schemas and definitions into a schema document.</t>
        </li>
        <li>
          <t><em>JSON Structure: Alternate Names and Descriptions</em> <xref target="JSTRUCT-ALTNAMES"/>:
Provides a mechanism for declaring multilingual descriptions, and alternate
names and symbols for types and properties.</t>
        </li>
        <li>
          <t><em>JSON Structure: Symbols, Scientific Units, and Currencies</em> <xref target="JSTRUCT-UNITS"/>:
Defines annotation keywords for specifying symbols, scientific units, and
currency codes complementing type information.</t>
        </li>
        <li>
          <t><em>JSON Structure: Validation</em> <xref target="JSTRUCT-VALIDATION"/>: Specifies extensions to
the core schema language for declaring validation rules for JSON data that
have no structural impact on the schema.</t>
        </li>
        <li>
          <t><em>JSON Structure: Composition</em> <xref target="JSTRUCT-COMPOSITION"/>: Defines a set of
conditional composition rules for evaluating schemas.</t>
        </li>
      </ul>
      <t>These extension specifications are enabled by the extensibility
(<xref target="extensions-and-add-ins"/>) features and can be applied to meta-schemas,
schemas, and JSON document instances.</t>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="json-structure-core-specification">
      <name>JSON Structure Core Specification</name>
      <section anchor="schema-elements">
        <name>Schema Elements</name>
        <section anchor="schema">
          <name>Schema</name>
          <t>A "schema" is a JSON object that describes, constrains, and interprets a JSON
node.</t>
          <t>This schema constrains a JSON node to be of type <tt>string</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "string"
}
]]></sourcecode>
          <t>In the case of a schema that references a compound type (<tt>object</tt>, <tt>set</tt>,
<tt>array</tt>, <tt>map</tt>, <tt>tuple</tt>, <tt>choice</tt>), the schema further describes the structure
of the compound type. Schemas can be placed into a namespace (<xref target="namespaces"/>)
for reuse in other schemas.</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  }
}
]]></sourcecode>
          <t>All schemas have an associated name that serves as an identifier. In the example
above where the schema is a root object, the name is the value of the <tt>name</tt>
property.</t>
          <t>When the schema is placed into a namespace (<xref target="namespaces"/>) or embedded into a
properties (<xref target="properties-keyword"/>) section of an <tt>object</tt> type, the name is the
key under which the schema is stored.</t>
          <t>Further rules for schemas are defined in <xref target="type-system-rules"/>.</t>
          <t>A "schema document" is a schema that represents the root of a schema hierarchy
and is the container format in which schemas are stored on disk or exchanged. A
schema document <bcp14>MAY</bcp14> contain multiple type declarations and namespaces. The
structure of schema documents is defined in <xref target="document-structure"/>.</t>
          <t>JSON Structure is extensible. All keywords that are not explicitly defined in
this document <bcp14>MAY</bcp14> be used for custom annotations and extensions. This also
applies to keywords that begin with the <tt>$</tt> character. A complete list of
reserved keywords is provided in <xref target="reserved-keywords"/>.</t>
          <t>The semantics of keywords defined in this document <bcp14>MAY</bcp14> be expanded by extension
specifications, but the core semantics of the keywords defined in this document
<bcp14>MUST NOT</bcp14> be altered.</t>
          <t>Be mindful that the use of custom keywords and annotations might conflict with
future versions of this specification or other extensions and that the authors
of this specification will not go out of their way to avoid such conflicts.</t>
          <t><xref target="extensions-and-add-ins"/> details the extensibility features.</t>
          <t>Formally, a schema is a constrained non-schema (<xref target="non-schema"/>) that requires a
type (<xref target="type-keyword"/>) keyword or a <tt>$ref</tt> (<xref target="ref-keyword"/>) keyword to be a
schema.</t>
        </section>
        <section anchor="non-schema">
          <name>Non-Schema</name>
          <t>Non-schemas are objects that do not declare or refer to a type. The root of a
schema document (<xref target="document-structure"/>) is a non-schema unless it contains a
<tt>type</tt> keyword.</t>
          <t>A namespace is a non-schema that contains type declarations and other
namespaces.</t>
        </section>
        <section anchor="meta-schemas">
          <name>Meta-Schemas</name>
          <t>A meta-schema is a schema document that defines the structure and constraints of
another schema document. Meta-schemas are used to validate schema documents and
to ensure that schemas are well-formed and conform to the JSON Structure
specification.</t>
          <t>The meta-schemas for JSON Structure and the extension specifications are
enumerated in the Appendix: Metaschemas (<xref target="schema"/>).</t>
          <t>Meta-schemas can extend existing meta-schemas by adding new keywords or
constraints. The <tt>$schema</tt> keyword is used to reference the meta-schema that a
schema document conforms to, the <tt>$id</tt> keyword is used to define the identifier
of the new meta-schema, and the <tt>$import</tt> keyword defined in the
<xref target="JSTRUCT-IMPORT"/> extension specification is used to import all definitions
from the foundational meta-schema.</t>
        </section>
      </section>
      <section anchor="data-types">
        <name>Data Types</name>
        <t>The data types that can be used with the <tt>type</tt> keyword are categorized into
JSON primitive types, extended types, compound types, and reusable types
<xref target="reusable-types"/>.</t>
        <t>While JSON Structure builds on the JSON data type model, it introduces a rich
set of types to represent structured data more accurately and to allow more
precise integration with common data types used in programming languages and
data formats. All these extended types have a well-defined representation in
JSON primitive types.</t>
        <section anchor="json-primitive-types">
          <name>JSON Primitive Types</name>
          <t>These types map directly to the underlying JSON representation:</t>
          <section anchor="string">
            <name><tt>string</tt></name>
            <t>A sequence of Unicode characters enclosed in double quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt> <xref section="7" sectionFormat="of" target="RFC8259"/></t>
              </li>
              <li>
                <t>Annotations: The <tt>maxLength</tt> keyword can be used on a schema with the <tt>string</tt>
type to specify the maximum length of the string. By default, the maximum
length is unlimited. The purpose of the keyword is to inform consumers of the
maximum space required to store the string.</t>
              </li>
            </ul>
          </section>
          <section anchor="number">
            <name><tt>number</tt></name>
            <t>A numeric literal without quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt> <xref section="6" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
            <t>Note that the <tt>number</tt> representation in JSON is a textual representation of a
decimal number (base-10) and therefore cannot accurately represent all possible
values of IEE754 floating-point numbers (base-2), in spite of JSON <tt>number</tt>
leaning on the IEEE754 standard as a reference for the value space.</t>
          </section>
          <section anchor="boolean">
            <name><tt>boolean</tt></name>
            <t>A literal <tt>true</tt> or <tt>false</tt> (without quotes).</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>boolean</tt> <xref section="3" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
          </section>
          <section anchor="null">
            <name><tt>null</tt></name>
            <t>A literal <tt>null</tt> (without quotes).</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>null</tt> <xref section="3" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="extended-primitive-types">
          <name>Extended Primitive Types</name>
          <t>Extended types impose additional semantic constraints on the underlying JSON
types. These types are used to represent binary data, high-precision numeric
values, date and time information, and structured data.</t>
          <t>Large integer and decimal types are used to represent high-precision numeric
values that exceed the range of IEEE 754 double-precision format, which is the
foundation for the <tt>number</tt> type in JSON. Per <xref section="6" sectionFormat="of" target="RFC8259"/>,
interoperable JSON numbers have a range of -2⁵³ to 2⁵³–1, which is less than the
range of 64-bit and 128-bit values. Therefore, the <tt>int64</tt>, <tt>uint64</tt>, <tt>int128</tt>,
<tt>uint128</tt>, and <tt>decimal</tt> types are represented as strings to preserve precision.</t>
          <t>The syntax for strings representing large integer and decimal types is based on
the <xref section="6" sectionFormat="of" target="RFC8259"/> syntax for integers and decimals:</t>
          <ul spacing="normal">
            <li>
              <t>integer = <tt>[minus] int</tt></t>
            </li>
            <li>
              <t>decimal = <tt>[minus] int frac</tt></t>
            </li>
          </ul>
          <section anchor="binary">
            <name><tt>binary</tt></name>
            <t>A binary value. The default encoding is Base64 <xref target="RFC4648"/>. The type annotation
keywords <tt>contentEncoding</tt>, <tt>contentCompression</tt>, and <tt>contentMediaType</tt> can be
used to specify the encoding, compression, and media type of the binary data.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> be an encoded binary value, with the encoding
specified in the <tt>contentEncoding</tt> keyword.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int8">
            <name><tt>int8</tt></name>
            <t>An 8-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2⁷ to 2⁷–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint8">
            <name><tt>uint8</tt></name>
            <t>An 8-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2⁸–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int16">
            <name><tt>int16</tt></name>
            <t>A 16-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2¹⁵ to 2¹⁵–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint16">
            <name><tt>uint16</tt></name>
            <t>A 16-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2¹⁶–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int32">
            <name><tt>int32</tt></name>
            <t>A 32-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range -2³¹ to 2³¹–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint32">
            <name><tt>uint32</tt></name>
            <t>A 32-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The numeric literal <bcp14>MUST</bcp14> be in the range 0 to 2³²–1.</t>
                  </li>
                  <li>
                    <t>No decimal points or quotes are allowed.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int64">
            <name><tt>int64</tt></name>
            <t>A 64-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>[minus] int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 64-bit integer in the range -2⁶³ to 2⁶³–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint64">
            <name><tt>uint64</tt></name>
            <t>A 64-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 64-bit integer in the range 0 to 2⁶⁴–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="int128">
            <name><tt>int128</tt></name>
            <t>A 128-bit signed integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>[minus] int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 128-bit integer in the range -2¹²⁷ to
2¹²⁷–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uint128">
            <name><tt>uint128</tt></name>
            <t>A 128-bit unsigned integer.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition for the
<tt>int</tt> syntax.</t>
                  </li>
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> represent a 128-bit integer in the range 0 to 2¹²⁸–1.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="float8">
            <name><tt>float8</tt></name>
            <t>An 8-bit floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 single-precision value range limits (8 bits), which are
3 bits of significand and 4 bits of exponent, with a range of approximately
±3.4×10³.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="float">
            <name><tt>float</tt></name>
            <t>A single-precision floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 single-precision value range limits (32 bits), which
are 24 bits of significand and 8 bits of exponent, with a range of
approximately ±3.4×10³⁸.</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>IEEE754 binary32 are base-2 encoded and therefore cannot represent all decimal
numbers accurately, and vice versa. In cases where you need to encode IEEE754
values precisely, store the IEE754 binary32 value as an <tt>int32</tt> or <tt>uint32</tt>
number.</t>
          </section>
          <section anchor="double">
            <name><tt>double</tt></name>
            <t>A double-precision floating-point number.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>Conforms to IEEE 754 double-precision value range limits (64 bits), which
are 53 bits of significand and 11 bits of exponent, with a range of
approximately ±1.7×10³⁰⁸.</t>
                  </li>
                </ul>
              </li>
            </ul>
            <t>IEEE754 binary64 are base-2 encoded and therefore cannot represent all decimal
numbers accurately, and vice versa. In cases where you need to encode IEEE754
values precisely, store the IEE754 binary64 value as an <tt>int64</tt> or <tt>uint64</tt>
number.</t>
          </section>
          <section anchor="decimal">
            <name><tt>decimal</tt></name>
            <t>A decimal number supporting high-precision values.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref section="6" sectionFormat="of" target="RFC8259"/> definition
for the <tt>[minus] int frac</tt> syntax.</t>
                  </li>
                  <li>
                    <t>Defaults: 34 significant digits and 7 fractional digits, which is the
maximum precision supported by the IEEE 754 decimal128 format.</t>
                  </li>
                </ul>
              </li>
              <li>
                <t>Annotations:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The <tt>precision</tt> keyword <bcp14>MAY</bcp14> be used to specify the total number of
significant digits.</t>
                  </li>
                  <li>
                    <t>The <tt>scale</tt> keyword <bcp14>MAY</bcp14> be used to specify the number of fractional digits.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="date">
            <name><tt>date</tt></name>
            <t>A date in YYYY-MM-DD form.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>full-date</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="datetime">
            <name><tt>datetime</tt></name>
            <t>A date and time value with time zone offset.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>date-time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="time">
            <name><tt>time</tt></name>
            <t>A time-of-day value.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="duration">
            <name><tt>duration</tt></name>
            <t>A time duration.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>duration</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uuid">
            <name><tt>uuid</tt></name>
            <t>A universally unique identifier.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC9562"/> <tt>UUID</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uri">
            <name><tt>uri</tt></name>
            <t>A URI reference, relative or absolute.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3986"/> <tt>uri-reference</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="jsonpointer">
            <name><tt>jsonpointer</tt></name>
            <t>A JSON Pointer reference.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC6901"/> JSON Pointer format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="compound-types">
          <name>Compound Types</name>
          <t>Compound types are used to structure related data elements. JSON Structure
supports the following compound types:</t>
          <section anchor="object">
            <name><tt>object</tt></name>
            <t>The <tt>object</tt> type is used to define structured data with named properties. It's
represented as a JSON object, which is an unordered collection of key–value
pairs.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>properties</tt> attribute that defines the
properties of the object. The <tt>properties</tt> attribute <bcp14>MUST</bcp14> be a JSON object where
each key is a property name and each value is a schema definition for the
property. The object <bcp14>MUST</bcp14> contain at least one property definition.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include a <tt>required</tt> attribute that defines the required
properties of the object.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include an <tt>additionalProperties</tt> attribute that defines
whether additional properties are allowed and/or what their schema is.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "name": "Person",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"],
  "additionalProperties": false
}
]]></sourcecode>
          </section>
          <section anchor="array">
            <name><tt>array</tt></name>
            <t>An <tt>array</tt> type is used to define an ordered collection of elements. It's
represented as a JSON array, which is an ordered list of values.</t>
            <t>The <tt>items</tt> attribute of an array <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t><strong>Examples:</strong></t>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="set">
            <name><tt>set</tt></name>
            <t>The <tt>set</tt> type is used to define an unordered collection of unique elements.
It's represented as a JSON array where all elements are unique.</t>
            <t>The <tt>items</tt> attribute of a <tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "$ref": "#/Namespace/TypeName" }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="map">
            <name><tt>map</tt></name>
            <t>The <tt>map</tt> type is used to define dynamic key–value pairs. It's represented as a
JSON object where the keys are strings and the values are of a specific type.</t>
            <t>Map keys <bcp14>MAY</bcp14> be any valid JSON string.</t>
            <t>The <tt>values</tt> attribute of a <tt>map</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "$ref": "#/StringType" }
}
]]></sourcecode>
          </section>
          <section anchor="tuple">
            <name><tt>tuple</tt></name>
            <t>The <tt>tuple</tt> type is used to define an ordered collection of elements with a
specific length. It's represented as a JSON array where each element is of a
specific type.</t>
            <t>The elements are defined using a <tt>properties</tt> map as with the <tt>object</tt>
(<xref target="object"/>) type and each element is named. This permits straightforward
mapping into application constructs. All declared properties of a <tt>tuple</tt> are
implicitly <bcp14>REQUIRED</bcp14>.</t>
            <t>The order of the elements in a tuple is declared using the <tt>tuple</tt> keyword
<xref target="tuple-keyword"/>, which is <bcp14>REQUIRED</bcp14>. The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> be a JSON array
of strings, where each declared property name <bcp14>MUST</bcp14> be an element of the array.
The order of the elements in the array defines the order of the properties in
the tuple.</t>
            <t>A <tt>tuple</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "tuple",
  "name": "Person",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "tuple": ["name", "age"]
}
]]></sourcecode>
            <t>The following JSON node is an valid instance of the <tt>tuple</tt> type defined above:</t>
            <sourcecode type="json"><![CDATA[
["Alice", 42]
]]></sourcecode>
          </section>
          <section anchor="any">
            <name><tt>any</tt></name>
            <t>The <tt>any</tt> type is used to define a type that can be any JSON value, including
primitive types, compound types, and extended types.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "any"
}
]]></sourcecode>
          </section>
          <section anchor="choice">
            <name><tt>choice</tt></name>
            <t>The <tt>choice</tt> type is used to define a "discriminated union" of types. A
choice is a set of types where only one type can be selected at a time and
where the selected type is determined by the value of a selector.</t>
            <t>The <tt>choice</tt> type can declare two variants of discriminated unions that
are represented differently in JSON:</t>
            <ul spacing="normal">
              <li>
                <t><em>Tagged unions</em>: The <tt>choice</tt> type is represented as a JSON object with a
single property whose name is the selector of the type as declared in the
<tt>choices</tt> (<xref target="choices-keyword"/>) map and whose value is of the selected type.</t>
              </li>
              <li>
                <t><em>Inline unions</em>: The <tt>choice</tt> type is represented as a JSON object of the
selected type with the selector as a property of the object.</t>
              </li>
            </ul>
            <section anchor="tagged-unions">
              <name>Tagged Unions</name>
              <t>A tagged union is declared as follows:</t>
              <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is a tagged union. For the
example, the following JSON node is a valid instance of the <tt>MyChoice</tt> type:</t>
              <sourcecode type="json"><![CDATA[
{
  "string": "Hello, world!"
}
]]></sourcecode>
              <t>or:</t>
              <sourcecode type="json"><![CDATA[
{
  "int32": 42
}
]]></sourcecode>
            </section>
            <section anchor="inline-unions">
              <name>Inline Unions</name>
              <t>Inline unions require for all type choices to extend a common base type.</t>
              <t>This is expressed by using the <tt>$extends</tt> (<xref target="extends-keyword"/>) keyword in the
<tt>choice</tt> declaration. The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> refer to a schema that defines
the base type and the base type <bcp14>MUST</bcp14> be abstract.</t>
              <t>If <tt>$extends</tt> is present, the <tt>selector</tt> property declares the name of the
injected property that acts as the selector for the inline union. The
type of the selector property is <tt>string</tt>. The selector property <bcp14>MAY</bcp14>
shadow a property of the base type; in this case, the base type property
<bcp14>MUST</bcp14> be of type <tt>string</tt>.</t>
              <t>The selector is defined as a property of the base type and the value of the
selector property <bcp14>MUST</bcp14> be a string that matches the name of one of the
options in the <tt>choices</tt> map.</t>
              <t>Example:</t>
              <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "type": "choice",
  "$extends": "#/definitions/Address",
  "selector": "addressType",
  "choices": {
    "StreetAddress": { "$ref": "#/definitions/StreetAddress" },
    "PostOfficeBoxAddress": { "$ref": "#/definitions/PostOfficeBoxAddress" }
  },
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is an inline union. This
example shows a JSON node that is a street address:</t>
              <sourcecode type="json"><![CDATA[
{
  "addressType": "StreetAddress",
  "street": "123 Main St",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101"
}
]]></sourcecode>
              <t>This example shows a JSON node that is a post office box address:</t>
              <sourcecode type="json"><![CDATA[
{
  "addressType": "PostOfficeBoxAddress",
  "poBox": "1234",
  "city": "Seattle",
  "state": "WA",
  "zip": "98101"
}
]]></sourcecode>
            </section>
          </section>
        </section>
      </section>
      <section anchor="document-structure">
        <name>Document Structure</name>
        <t>A JSON Structure document is a JSON object that contains schemas (<xref target="schema"/>)</t>
        <t>The root of a JSON Structure document <bcp14>MUST</bcp14> be a JSON object.</t>
        <t>The root object <bcp14>MUST</bcp14> contain the following <bcp14>REQUIRED</bcp14> keywords:</t>
        <ul spacing="normal">
          <li>
            <t><tt>$id</tt>: A URI that is the unique identifier for this schema document.</t>
          </li>
          <li>
            <t><tt>$schema</tt>: A URI that identifies the version and meta-schema of the JSON
Structure specification used.</t>
          </li>
          <li>
            <t><tt>name</tt>: A string that provides a name for the document. If the root object
 defines a type, the <tt>name</tt> attribute is also the name of the type.</t>
          </li>
        </ul>
        <t>The presence of both keywords identifies the document as a JSON Structure
document.</t>
        <t>The root object <bcp14>MAY</bcp14> contain the following <bcp14>OPTIONAL</bcp14> keywords:</t>
        <ul spacing="normal">
          <li>
            <t><tt>$root</tt>: A JSON Pointer that designates a reusable type as the root type for
instances.</t>
          </li>
          <li>
            <t><tt>definitions</tt>: The root of the type declaration namespace hierarchy.</t>
          </li>
          <li>
            <t><tt>type</tt>: A type declaration for the root type of the document. Mutually
exclusive with <tt>$root</tt>.</t>
          </li>
          <li>
            <t>if <tt>type</tt> is present, all annotations and constraints applicable to this
declared root type are also permitted at the root level.</t>
          </li>
        </ul>
        <section anchor="namespaces">
          <name>Namespaces</name>
          <t>A namespace is a JSON object that provides a scope for type declarations or
other namespaces. Namespaces <bcp14>MAY</bcp14> be nested within other namespaces.</t>
          <t>The <tt>definitions</tt> keyword forms the root of the namespace hierarchy for reusable
type definitions. All type declarations immediately under the <tt>definitions</tt>
keyword are in the root namespace.</t>
          <t>A <tt>type</tt> definition at the root is placed into the root namespace as if it were
a type declaration under <tt>definitions</tt>.</t>
          <t>Any object in the <tt>definitions</tt> map that is not a type declaration is a
namespace.</t>
          <t>Example with inline <tt>type</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
          <t>Example with <tt>$root</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "$root": "#/definitions/TypeName",
    "definitions": {
        "TypeName": {
            "type": "object",
            "properties": {
                "name": { "type": "string" }
            }
        }
    }
}
]]></sourcecode>
          <t>Example with the root type in a namespace:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "$root": "#/definitions/Namespace/TypeName",
    "definitions": {
        "Namespace": {
            "TypeName": {
                "name": "TypeName",
                "type": "object",
                "properties": {
                    "name": { "type": "string" }
                }
            }
        }
    }
}
]]></sourcecode>
        </section>
        <section anchor="schema-keyword">
          <name><tt>$schema</tt> Keyword</name>
          <t>The value of the <bcp14>REQUIRED</bcp14> <tt>$schema</tt> keyword <bcp14>MUST</bcp14> be an absolute URI. The keyword
has different functions in JSON Structure documents and JSON documents.</t>
          <ul spacing="normal">
            <li>
              <t>In JSON Structure schema documents, the <tt>$schema</tt> keyword references a
meta-schema that this document conforms to.</t>
            </li>
            <li>
              <t>In JSON documents, the <tt>$schema</tt> keyword references a JSON Structure schema
document that defines the structure of the JSON document.</t>
            </li>
          </ul>
          <t>The value of <tt>$schema</tt> <bcp14>MUST</bcp14> correspond to the <tt>$id</tt> of the referenced
meta-schema or schema document.</t>
          <t>The <tt>$schema</tt> keyword <bcp14>MUST</bcp14> be used at the root level of the document.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
          <t>Use of the keyword <tt>$schema</tt> does NOT import the referenced schema document such
that its types become available for use in the current document.</t>
        </section>
        <section anchor="id-keyword">
          <name><tt>$id</tt> Keyword</name>
          <t>The <bcp14>REQUIRED</bcp14> <tt>$id</tt> keyword is used to assign a unique identifier to a JSON
Structure schema document. The value of <tt>$id</tt> <bcp14>MUST</bcp14> be an absolute URI. It <bcp14>SHOULD</bcp14>
be a resolvable URI (a URL).</t>
          <t>The <tt>$id</tt> keyword is used to identify a schema document in references like
<tt>$schema</tt>.</t>
          <t>The <tt>$id</tt> keyword <bcp14>MUST</bcp14> only be used once in a document, at the root level.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "name": "TypeName",
    "type": "object",
    "properties": {
        "name": { "type": "string" }
    }
}
]]></sourcecode>
        </section>
        <section anchor="root-keyword">
          <name><tt>$root</tt> Keyword</name>
          <t>The <bcp14>OPTIONAL</bcp14> <tt>$root</tt> keyword is used to designate any reusable type defined in
the document as the root type of this schema document. The value of <tt>$root</tt> <bcp14>MUST</bcp14>
be a valid JSON Pointer that resolves to an existing type definition inside the
<tt>definitions</tt> object.</t>
          <t>The <tt>$root</tt> keyword <bcp14>MUST</bcp14> only be used once in a document, at the root level. Its
use is mutually exclusive with the <tt>type</tt> keyword.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "$root": "#/definitions/Namespace/TypeName",
  "definitions": {
      "Namespace": {
          "TypeName": {
            "name": "TypeName",
            "type": "object",
            "properties": {
                "name": { "type": "string" }
            }
          }
      }
  }
}
]]></sourcecode>
        </section>
        <section anchor="definitions-keyword">
          <name><tt>definitions</tt> Keyword</name>
          <t>The <tt>definitions</tt> keyword defines a namespace hierarchy for reusable type
declarations. The keyword <bcp14>MUST</bcp14> be used at the root level of the document.</t>
          <t>The value of the <tt>definitions</tt> keyword <bcp14>MUST</bcp14> be a map of types and namespaces.
The namespace at the root level of the <tt>definitions</tt> keyword is the root
namespace.</t>
          <t>A namespace is a JSON object that provides a scope for type declarations or
other namespaces. Any JSON object under the <tt>definitions</tt> keyword that is not a
type definition (containing the <tt>type</tt> attribute) is considered a namespace.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/TypeName",
    "definitions": {
        "Namespace": {
            "TypeName": {
                "name": "TypeName",
                "type": "object",
                "properties": {
                    "name": { "type": "string" }
                }
            }
        }
    }
}
]]></sourcecode>
        </section>
        <section anchor="ref-keyword">
          <name><tt>$ref</tt> Keyword</name>
          <t>References to type declarations within the same document <bcp14>MUST</bcp14> use a schema
containing a single property with the name <tt>$ref</tt> as the value of <tt>type</tt>. The
value of <tt>$ref</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer Fragment Identifier
(see <xref section="6" sectionFormat="of" target="RFC6901"/>) that resolves to an existing type definition.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "properties": {
      "name1": { "type": { "$ref": "#/definitions/Namespace/TypeName" }},
      "name2": { "type": { "$ref": "#/definitions/Namespace2/TypeName2" }}
  },
  "definitions": {
      "Namespace": {
          "TypeName": {
              "name": "TypeName",
              "type": "object",
              "properties": {
                  "name": { "type": "string" }
              }
          }
      },
      "Namespace2": {
          "TypeName2": {
              "name": "TypeName2",
              "type": "object",
              "properties": {
                  "name": { "type": { "$ref": "#/definitions/Namespace/TypeName" }}
              }
          }
      }
  }
}
]]></sourcecode>
          <t>The <tt>$ref</tt> keyword is only permitted inside the <tt>type</tt> attribute value of a
schema definition, including in type unions.</t>
          <t><tt>$ref</tt> is NOT permitted in other attributes and <bcp14>MUST NOT</bcp14> be used inside the
<tt>type</tt> of the root object.</t>
        </section>
        <section anchor="cross-references">
          <name>Cross-references</name>
          <t>In JSON Structure documents, the <tt>$schema</tt> keyword references the meta-schema of
this specification. In JSON documents, the <tt>$schema</tt> keyword references the
schema document that defines the structure of the JSON document. The value of
<tt>$schema</tt> is a URI. Ideally, the URI <bcp14>SHOULD</bcp14> be a resolvable URL to a schema
document, but it's primarily an identifier. As an identifier, it can be used as
a lookup key in a cache or schema-registry.</t>
          <t>The <bcp14>OPTIONAL</bcp14> <xref target="JSTRUCT-IMPORT"/> extension specification is the exception and
provides a mechanism for importing definitions from external schemas.</t>
        </section>
      </section>
      <section anchor="type-system-rules">
        <name>Type System Rules</name>
        <section anchor="schema-declarations">
          <name>Schema Declarations</name>
          <ul spacing="normal">
            <li>
              <t>Every schema element <bcp14>MUST</bcp14> declare a <tt>type</tt> referring to a primitive, compound,
or reusable type.</t>
            </li>
            <li>
              <t>To reference a reusable type, the <tt>type</tt> attribute <bcp14>MUST</bcp14> be a schema with a
single <tt>$ref</tt> property resolving to an existing type declaration.</t>
            </li>
            <li>
              <t>Compound types <bcp14>SHOULD</bcp14> be declared in the <tt>definitions</tt> section as reusable
types. Inline compound types in arrays, maps, unions, or property definitions
<bcp14>MUST NOT</bcp14> be referenced externally.</t>
            </li>
            <li>
              <t>Primitive and compound type declarations are confined to this specification.</t>
            </li>
            <li>
              <t>Defined types:
              </t>
              <ul spacing="normal">
                <li>
                  <t><strong>JSON Primitives:</strong> <tt>string</tt>, <tt>number</tt>, <tt>boolean</tt>, <tt>null</tt>.</t>
                </li>
                <li>
                  <t><strong>Extended Primitives:</strong> <tt>int32</tt>, <tt>uint32</tt>, <tt>int64</tt>, <tt>uint64</tt>, <tt>int128</tt>,
<tt>uint128</tt>, <tt>float</tt>, <tt>double</tt>, <tt>decimal</tt>, <tt>date</tt>, <tt>datetime</tt>, <tt>time</tt>,
<tt>duration</tt>, <tt>uuid</tt>, <tt>uri</tt>, <tt>binary</tt>, <tt>jsonpointer</tt>.</t>
                </li>
                <li>
                  <t><strong>JSON Compounds:</strong> <tt>object</tt>, <tt>array</tt>.</t>
                </li>
                <li>
                  <t><strong>Extended Compounds:</strong> <tt>map</tt>, <tt>set</tt>, <tt>tuple</tt>, <tt>any</tt>, <tt>choice</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="reusable-types">
          <name>Reusable Types</name>
          <ul spacing="normal">
            <li>
              <t>Reusable types <bcp14>MUST</bcp14> be defined in the <tt>definitions</tt> section.</t>
            </li>
            <li>
              <t>Each declaration in <tt>definitions</tt> <bcp14>MUST</bcp14> have a unique, case-sensitive name
within its namespace. The same name <bcp14>MAY</bcp14> appear in different namespaces.</t>
            </li>
          </ul>
        </section>
        <section anchor="type-references">
          <name>Type References</name>
          <ul spacing="normal">
            <li>
              <t>Use <tt>$ref</tt> to reference types declared in the same document.</t>
            </li>
            <li>
              <t><tt>$ref</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer to an existing type declaration.</t>
            </li>
            <li>
              <t><tt>$ref</tt> <bcp14>MAY</bcp14> include a <tt>description</tt> attribute for additional context.</t>
            </li>
          </ul>
        </section>
        <section anchor="dynamic-structures">
          <name>Dynamic Structures</name>
          <ul spacing="normal">
            <li>
              <t>Use the <tt>map</tt> type for dynamic key–value pairs. The <tt>object</tt> type requires at
least one property and cannot model fully dynamic properties with
<tt>additionalProperties</tt>.</t>
            </li>
            <li>
              <t>The <tt>values</tt> attribute of a <tt>map</tt> and the <tt>items</tt> attribute of an <tt>array</tt> or
<tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type, a primitive type, or a locally declared
compound type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="composition-rules">
        <name>Composition Rules</name>
        <t>This section defines the rules for composing schemas. Further, <bcp14>OPTIONAL</bcp14>
composition rules are defined in the <xref target="JSTRUCT-COMPOSITION"/> extension
specification.</t>
        <section anchor="unions">
          <name>Unions</name>
          <ul spacing="normal">
            <li>
              <t>Non-discriminated type unions are formed as sets of primitive types and type
references. It is NOT permitted to define a compound type inline inside a
non-discriminated type union. Discriminated unions are formed as a
<tt>choice</tt> (<xref target="choice"/>) type to which the rules of this section do not apply.</t>
            </li>
            <li>
              <t>A type union is a composite type reference and not a standalone compound type
and is therefore not named.</t>
            </li>
            <li>
              <t>The JSON node described by a schema with a type union <bcp14>MUST</bcp14> conform to at least
one of the types in the union.</t>
            </li>
            <li>
              <t>If the JSON node described by a schema with a type union conforms to more than
one type in the union, the JSON node <bcp14>MUST</bcp14> be considered to be of the first
matching type in the union.</t>
            </li>
          </ul>
          <t><strong>Examples:</strong></t>
          <t>Union of a string and a compound type:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "$ref": "#/Namespace/TypeName" } ]
}
]]></sourcecode>
          <t>Union of a string and an <tt>int32</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", "int32"]
}
]]></sourcecode>
          <t>A valid union of a string and a <tt>map</tt> of strings:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "map", "values": { "type": "string" } } ]
}
]]></sourcecode>
          <t>An inline definition of a compound type in a union is NOT permitted:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "object", "properties": { "name": { "type": "string" } } } ]
}
]]></sourcecode>
        </section>
        <section anchor="prohibition-of-top-level-unions">
          <name>Prohibition of Top-Level Unions</name>
          <ul spacing="normal">
            <li>
              <t>The root of a JSON Structure document <bcp14>MUST NOT</bcp14> be an array.</t>
            </li>
            <li>
              <t>If a type union is desired as the type of the root of a document instance, the
<tt>$root</tt> keyword <bcp14>MUST</bcp14> be used to designate a type union as the root type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="identifier-rules">
        <name>Identifier Rules</name>
        <t>All property names and type names <bcp14>MUST</bcp14> conform to the regular expression
<tt>[A-Za-z_][A-Za-z0-9_]*</tt>. They <bcp14>MUST</bcp14> begin with a letter or underscore and <bcp14>MAY</bcp14>
contain letters, digits, and underscores. Keys and type names are
case-sensitive.</t>
        <t>If names need to contain characters outside of this range, consider using the
<xref target="JSTRUCT-ALTNAMES"/> extension specification to define those.</t>
      </section>
      <section anchor="structural-keywords">
        <name>Structural Keywords</name>
        <section anchor="type-keyword">
          <name>The <tt>type</tt> Keyword</name>
          <t>Declares the type of a schema element as a primitive or compound type. The
<tt>type</tt> keyword <bcp14>MUST</bcp14> be present in every schema element. For unions, the value of
<tt>type</tt> <bcp14>MUST</bcp14> be an array of type references or primitive type names.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string"
}
]]></sourcecode>
        </section>
        <section anchor="properties-keyword">
          <name>The <tt>properties</tt> Keyword</name>
          <t><tt>properties</tt> defines the properties of an <tt>object</tt> type.</t>
          <t>The <tt>properties</tt> keyword <bcp14>MUST</bcp14> contain a map of property names mapped to schema
definitions.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="required-keyword">
          <name>The <tt>required</tt> Keyword</name>
          <t><tt>required</tt> defines the required properties of an <tt>object</tt> type. The <tt>required</tt>
keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt>.</t>
          <t>The value of the <tt>required</tt> keyword is a simple array of property names or an
array of arrays of property names.</t>
          <t>An array of arrays is used to define alternative sets of required properties.
When alternative sets are used, exactly one of the sets <bcp14>MUST</bcp14> match the
properties of the object, meaning they are mutually exclusive.</t>
          <t>Property names in the <tt>required</tt> array <bcp14>MUST</bcp14> be present in <tt>properties</tt>.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"]
}
]]></sourcecode>
          <t>Example with alternative sets:</t>
          <t>Because the <tt>name</tt> property is required in both sets, the <tt>name</tt> property is
required in all objects. The <tt>fins</tt> property is required in the first set, and
the <tt>legs</tt> property is required in the second set. That means that an object
<bcp14>MUST</bcp14> have either <tt>fins</tt> or <tt>legs</tt> but not both.</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "fins": { "type": "int32" },
    "legs": { "type": "int32" },
    "wings": { "type": "int32" }
  },
  "required": [["name", "fins"], ["name", "legs"]]
}
]]></sourcecode>
        </section>
        <section anchor="items-keyword">
          <name>The <tt>items</tt> Keyword</name>
          <t>Defines the schema for elements in an <tt>array</tt> or <tt>set</tt> type. The value is a type
reference or a primitive type name or a locally declared compound type.</t>
          <t>Examples:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/Namespace/TypeName" }}
}
]]></sourcecode>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="values-keyword">
          <name>The <tt>values</tt> Keyword</name>
          <t>Defines the schema for values in a <tt>map</tt> type.</t>
          <t>The <tt>values</tt> keyword <bcp14>MUST</bcp14> reference a reusable type or a primitive type or a
locally declared compound type.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="const-keyword">
          <name>The <tt>const</tt> Keyword</name>
          <t>Constrains the values of the JSON node described by the schema to a single,
specific value. The <tt>const</tt> keyword <bcp14>MUST</bcp14> appear only in schemas with a primitive
<tt>type</tt>, and the instance value <bcp14>MUST</bcp14> match the provided constant exactly.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "const": "example"
}
]]></sourcecode>
        </section>
        <section anchor="enum-keyword">
          <name>The <tt>enum</tt> Keyword</name>
          <t>Constrains a schema to match one of a specific set of values. The <tt>enum</tt> keyword
<bcp14>MUST</bcp14> appear only in schemas with a primitive <tt>type</tt>, and all values in the enum
array <bcp14>MUST</bcp14> match that type. Values <bcp14>MUST</bcp14> be unique.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "enum": ["value1", "value2", "value3"]
}
]]></sourcecode>
          <t>It is NOT permitted to use <tt>enum</tt> in conjunction with a type union in <tt>type</tt>.</t>
        </section>
        <section anchor="additionalproperties-keyword">
          <name>The <tt>additionalProperties</tt> Keyword</name>
          <t><tt>additionalProperties</tt> defines whether additional properties are allowed in an
<tt>object</tt> type and, optionally, what their schema is. The value <bcp14>MUST</bcp14> be a boolean
or a schema. If set to <tt>false</tt>, no additional properties are allowed. If
provided with a schema, each additional property <bcp14>MUST</bcp14> conform to it.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  },
  "additionalProperties": false
}
]]></sourcecode>
        </section>
        <section anchor="choices-keyword">
          <name>The <tt>choices</tt> Keyword</name>
          <t><tt>choices</tt> defines the choices of a <tt>choice</tt> type. The value <bcp14>MUST</bcp14> be a map of
type names to schemas. Each type name <bcp14>MUST</bcp14> be unique within the <tt>choices</tt> map.</t>
          <t>The value of each type name <bcp14>MUST</bcp14> be a schema. Inline compound types are permitted.</t>
          <t>The <tt>choices</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t><strong>*Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="selector-keyword">
          <name>The <tt>selector</tt> Keyword</name>
          <t>The <tt>selector</tt> keyword defines the name of the property that acts as the selector
for the type in a <tt>choice</tt> type. The value of <tt>selector</tt> <bcp14>MUST</bcp14> be a string.</t>
          <t>The <tt>selector</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t>See <tt>choice</tt> (<xref target="choice"/>) for an example.</t>
        </section>
        <section anchor="tuple-keyword">
          <name>The <tt>tuple</tt> Keyword</name>
          <t>The <tt>tuple</tt> keyword defines the order of properties in a <tt>tuple</tt> type. The
value of <tt>tuple</tt> <bcp14>MUST</bcp14> be an array of strings, where each string is the name of a
property defined in the <tt>properties</tt> map. The order of the strings in the array
defines the order of the properties in the tuple.</t>
          <t>The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>tuple</tt> (<xref target="tuple"/>).</t>
          <t>See <tt>tuple</tt> (<xref target="tuple"/>) for an example.</t>
        </section>
      </section>
      <section anchor="type-annotation-keywords">
        <name>Type Annotation Keywords</name>
        <t>Type annotation keywords provide additional metadata about the underlying type.
These keywords are used for documentation and validation of additional
constraints on types.</t>
        <section anchor="maxlength-keyword">
          <name>The <tt>maxLength</tt> Keyword</name>
          <t>Specifies the maximum allowed length for a string. The <tt>maxLength</tt> keyword <bcp14>MUST</bcp14>
be used only with <tt>string</tt> types, and the string’s length <bcp14>MUST</bcp14> not exceed this
value.</t>
          <t>The purpose of <tt>maxLength</tt> is to provide a known storage constraint on the
maximum length of a string. The value <bcp14>MAY</bcp14> be used for validation.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "maxLength": 255
}
]]></sourcecode>
        </section>
        <section anchor="precision-keyword">
          <name>The <tt>precision</tt> Keyword</name>
          <t>Specifies the total number of significant digits for numeric values. The
<tt>precision</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt> types.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "precision": 10
}
]]></sourcecode>
        </section>
        <section anchor="scale-keyword">
          <name>The <tt>scale</tt> Keyword</name>
          <t>Specifies the number of digits to the right of the decimal point for numeric
values. The <tt>scale</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt>
types to constrain the fractional part.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "scale": 2
}
]]></sourcecode>
        </section>
        <section anchor="contentencoding-keyword">
          <name>The <tt>contentEncoding</tt> Keyword</name>
          <t>Specifies the encoding of a binary value. The <tt>contentEncoding</tt> keyword is used
as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentEncoding</tt> are defined in <xref target="RFC4648"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>base64</tt>: The binary value is encoded as a base64 string.</t>
            </li>
            <li>
              <t><tt>base64url</tt>: The binary value is encoded as a base64url string.</t>
            </li>
            <li>
              <t><tt>base16</tt>: The binary value is encoded as a base16 string.</t>
            </li>
            <li>
              <t><tt>base32</tt>: The binary value is encoded as a base32 string.</t>
            </li>
            <li>
              <t><tt>base32hex</tt>: The binary value is encoded as a base32hex string.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64"
}
]]></sourcecode>
        </section>
        <section anchor="contentcompression-keyword">
          <name>The <tt>contentCompression</tt> Keyword</name>
          <t>Specifies the compression algorithm used for a binary value before encoding. The
<tt>contentCompression</tt> keyword is used as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentCompression</tt> are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>gzip</tt>: The binary value is compressed using the gzip algorithm. See
<xref target="RFC1952"/>.</t>
            </li>
            <li>
              <t><tt>deflate</tt>: The binary value is compressed using the deflate algorithm. See
<xref target="RFC1951"/>.</t>
            </li>
            <li>
              <t><tt>zlib</tt>: The binary value is compressed using the zlib algorithm. See
<xref target="RFC1950"/>.</t>
            </li>
            <li>
              <t><tt>brotli</tt>: The binary value is compressed using the brotli algorithm. See
<xref target="RFC7932"/>.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "compression": "gzip"
}
]]></sourcecode>
        </section>
        <section anchor="contentmediatype-keyword">
          <name>The <tt>contentMediaType</tt> Keyword</name>
          <t>Specifies the media type of a binary value. The <tt>contentMediaType</tt> keyword is
used as an annotation for <tt>binary</tt> types.</t>
          <t>The value of <tt>contentMediaType</tt> <bcp14>MUST</bcp14> be a valid media type as defined in
<xref target="RFC6838"/>.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "mediaType": "image/png"
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="documentation-keywords">
        <name>Documentation Keywords</name>
        <t>Documentation keywords provide descriptive information for schema elements. They
are <bcp14>OPTIONAL</bcp14> but <bcp14>RECOMMENDED</bcp14> for clarity.</t>
        <section anchor="description-keyword">
          <name>The <tt>description</tt> Keyword</name>
          <t>Provides a human-readable description of a schema element. The <tt>description</tt>
keyword <bcp14>SHOULD</bcp14> be used to document any schema element.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "description": "A person's name"
}
]]></sourcecode>
          <t>For multi-lingual descriptions, the <xref target="JSTRUCT-ALTNAMES"/> companion provides an
extension to define several concurrent descriptions in multiple languages.</t>
        </section>
        <section anchor="examples-keyword">
          <name>The <tt>examples</tt> Keyword</name>
          <t>Provides example instance values that conform to the schema. The <tt>examples</tt>
keyword <bcp14>SHOULD</bcp14> be used to document potential instance values.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "examples": ["example1", "example2"]
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="extensions-and-add-ins">
        <name>Extensions and Add-Ins</name>
        <t>The <tt>abstract</tt> and <tt>$extends</tt> keywords enable controlled type extension,
supporting basic object-oriented-programming-style inheritance while not
permitting subtype polymorphism where a sub-type value can be assigned a
base-typed property. This approach avoids validation complexities and mapping
issues between JSON schemas, programming types, and databases.</t>
        <t>An <em>extensible type</em> is declared as <tt>abstract</tt> and serves as a base for
extensions. For example, a base type <em>Address</em> <bcp14>MAY</bcp14> be extended by
<em>StreetAddress</em> and <em>PostOfficeBoxAddress</em> via <tt>$extends</tt>, but <em>Address</em> cannot
be used directly.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
        <t>A <em>add-in type</em> is declared as <tt>abstract</tt> and <tt>$extends</tt> a specific type that
does not need to be abstract. For example, an add-in type <em>DeliveryInstructions</em>
might be applied to any <em>StreetAddress</em> types in a document:</t>
        <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/Addresses",
    "$root": "#/definitions/StreetAddress",
    "$offers": {
        "DeliveryInstructions": "#/definitions/DeliveryInstructions"
    },
    "definitions" : {
      "StreetAddress": {
        "type": "object",
        "properties": {
            "street": { "type": "string" },
            "city": { "type": "string" },
            "state": { "type": "string" },
            "zip": { "type": "string" }
        }
      },
      "DeliveryInstructions": {
        "abstract": true,
        "type": "object",
        "$extends": "#/definitions/StreetAddress",
        "properties": {
            "instructions": { "type": "string" }
        }
      }
    }
}
]]></sourcecode>
        <t>Add-in types are options that a document author can enable for a schema. The
definitions of add-in types are not part of the main schema by default, but are
injected into the designated schema type when the document author chooses to use
them.</t>
        <t>Add-in types are advertised in the schema document through the <tt>$offers</tt>
keyword, which is a map that defines add-in names for add-in schema definitions
that exist in the document.</t>
        <t>Add-ins are applied to a schema by referencing the add-in name in the <tt>$uses</tt>
keyword that is available only in instance documents. The <tt>$uses</tt> keyword is a
set of add-in names that are applied to the schema for the document.</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://schemas.vasters.com/Addresses",
  "$uses": ["DeliveryInstructions"],
  "street": "123 Main St",
  "city": "Anytown",
  "state": "QA",
  "zip": "00001",
  "instructions": "Leave at the back door"
}
]]></sourcecode>
        <section anchor="abstract-keyword">
          <name>The <tt>abstract</tt> Keyword</name>
          <t>The <tt>abstract</tt> keyword declares a type as abstract. This prohibits its direct
use in any type declaration or as the type of a schema element. Abstract types
are used as base types for extension via <tt>$extends</tt> or as add-in types via
<tt>$addins</tt>.</t>
          <t>Abstract types implicitly permit additional properties (<tt>additionalProperties</tt>
is always <tt>true</tt>).</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A boolean (<tt>true</tt> or <tt>false</tt>).</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>abstract</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MUST NOT</bcp14> be used as the type of a schema element or
referenced via <tt>$ref</tt>.</t>
                </li>
                <li>
                  <t>The <tt>additionalProperties</tt> keyword <bcp14>MUST NOT</bcp14> be used on abstract types (its
value is implicitly <tt>true</tt>).</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MAY</bcp14> extend other abstract types via <tt>$extends</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="extends-keyword">
          <name>The <tt>$extends</tt> Keyword</name>
          <t>The <tt>$extends</tt> keyword merges all properties from an abstract base type into the
extending type.</t>
          <t>If the type using <tt>$extends</tt> is marked as <tt>abstract</tt> and referenced via
<tt>$addins</tt>, the composite type <em>replaces</em> the base type in the type model of the
document.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A JSON Pointer to an abstract type.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>The value of <tt>$extends</tt> <bcp14>MUST</bcp14> be a valid JSON Pointer that points to an
abstract type within the same document.</t>
                </li>
                <li>
                  <t>The extending type <bcp14>MUST</bcp14> merge the abstract type’s properties and constraints
and <bcp14>MUST NOT</bcp14> redefine any inherited property.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="offers-keyword">
          <name>The <tt>$offers</tt> Keyword</name>
          <t>The <tt>$offers</tt> keyword is used to advertise add-in types that are available for
use in a schema document. The <tt>$offers</tt> keyword is a map of add-in names to
add-in schema definitions.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A map of add-in names to add-in schema definitions.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$offers</tt> keyword <bcp14>MUST</bcp14> only be used in the root object of a schema
document.</t>
                </li>
                <li>
                  <t>The value of <tt>$offers</tt> <bcp14>MUST</bcp14> be a map where each key is a string and each
value is a JSON Pointer to an add-in schema definition in the same document
or a set of JSON Pointers to add-in schema definitions in the same document.
If the value is a set, the add-in name selects all add-in schema definitions
at the same time.</t>
                </li>
                <li>
                  <t>The keys in the <tt>$offers</tt> map <bcp14>MUST</bcp14> be unique.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="uses-keyword">
          <name>The <tt>$uses</tt> Keyword</name>
          <t>The <tt>$uses</tt> keyword is used to apply add-in types to a schema <em>in an instance
document</em> that references the schema. The keyword <bcp14>MAY</bcp14> be used in a meta-schema
that references a parent schema.</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A set of add-in names or JSON Pointers to add-in schema definitions
in the same meta-schema document.</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>$uses</tt> keyword <bcp14>MUST</bcp14> only be used in instance documents.</t>
                </li>
                <li>
                  <t>The value of <tt>$uses</tt> <bcp14>MUST</bcp14> be a set of strings that are either:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>add-in names advertised in the <tt>$offers</tt> keyword of the schema document
referenced by the <tt>$schema</tt> keyword of the instance document or</t>
                    </li>
                    <li>
                      <t>JSON Pointers to add-in schema definitions in the same meta-schema
document.</t>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="reserved-keywords">
      <name>Reserved Keywords</name>
      <t>The following keywords are reserved in JSON Structure and <bcp14>MUST NOT</bcp14> be used as
custom annotations or extension keywords:</t>
      <ul spacing="normal">
        <li>
          <t><tt>definitions</tt></t>
        </li>
        <li>
          <t><tt>$extends</tt></t>
        </li>
        <li>
          <t><tt>$id</tt></t>
        </li>
        <li>
          <t><tt>$ref</tt></t>
        </li>
        <li>
          <t><tt>$root</tt></t>
        </li>
        <li>
          <t><tt>$schema</tt></t>
        </li>
        <li>
          <t><tt>$uses</tt></t>
        </li>
        <li>
          <t><tt>$offers</tt></t>
        </li>
        <li>
          <t><tt>abstract</tt></t>
        </li>
        <li>
          <t><tt>additionalProperties</tt></t>
        </li>
        <li>
          <t><tt>choices</tt></t>
        </li>
        <li>
          <t><tt>const</tt></t>
        </li>
        <li>
          <t><tt>default</tt></t>
        </li>
        <li>
          <t><tt>description</tt></t>
        </li>
        <li>
          <t><tt>enum</tt></t>
        </li>
        <li>
          <t><tt>examples</tt></t>
        </li>
        <li>
          <t><tt>format</tt></t>
        </li>
        <li>
          <t><tt>items</tt></t>
        </li>
        <li>
          <t><tt>maxLength</tt></t>
        </li>
        <li>
          <t><tt>name</tt></t>
        </li>
        <li>
          <t><tt>precision</tt></t>
        </li>
        <li>
          <t><tt>properties</tt></t>
        </li>
        <li>
          <t><tt>required</tt></t>
        </li>
        <li>
          <t><tt>scale</tt></t>
        </li>
        <li>
          <t><tt>selector</tt></t>
        </li>
        <li>
          <t><tt>type</tt></t>
        </li>
        <li>
          <t><tt>values</tt></t>
        </li>
      </ul>
    </section>
    <section anchor="cbor-type-system-mapping">
      <name>CBOR Type System Mapping</name>
      <t>CBOR <xref target="RFC8949"/> is a binary encoding of JSON-like data structures. The CBOR
type system is a superset of the JSON type system and adds "binary strings" as
its most substantial type system extension. Otherwise, CBOR is structurally
compatible with JSON.</t>
      <t>JSON Structure <bcp14>MAY</bcp14> be used to describe CBOR-encoded data structures. For
encoding CBOR data structures, the data structure is first mapped to a JSON type
model as described in this specification, with the exception that the <xref target="binary"/>
primitive type is preserved as a byte array. The resulting mapping is converted
into CBOR per the rules spelled out in <xref section="6.2" sectionFormat="of" target="RFC8949"/>.</t>
      <t>The decoding process is the reverse of the encoding process. The CBOR-encoded
data structure is first decoded into a JSON type model, and then the JSON type
model is validated against the JSON Structure schema, with <tt>binary</tt> types
validated as byte arrays.</t>
    </section>
    <section anchor="media-type">
      <name>Media Type</name>
      <t>The media type for JSON Structure documents is <tt>application/json-structure</tt>.</t>
      <t>It is <bcp14>RECOMMENDED</bcp14> to append the structured syntax suffix <tt>+json</tt> to indicate
unambiguously that the content is a JSON document, if the document is a JSON
document. In spite of this specification being focused on JSON, the JSON
Structure documents <bcp14>MAY</bcp14> be encoded using other serialization formats that can
represent the same data structure, such as CBOR <xref target="RFC8949"/>.</t>
      <ul spacing="normal">
        <li>
          <t>Type name: application</t>
        </li>
        <li>
          <t>Subtype name: json-structure</t>
        </li>
        <li>
          <t>Required parameters: none</t>
        </li>
        <li>
          <t>Optional parameters: none</t>
        </li>
        <li>
          <t>Encoding considerations: binary</t>
        </li>
        <li>
          <t>Security considerations: see <xref target="security-considerations"/></t>
        </li>
        <li>
          <t>Interoperability considerations: none</t>
        </li>
        <li>
          <t>Published specification: this document</t>
        </li>
        <li>
          <t>Applications that use this media type: none</t>
        </li>
        <li>
          <t>Fragment identifier considerations: none</t>
        </li>
        <li>
          <t>Additional information: none</t>
        </li>
      </ul>
    </section>
    <section anchor="media-type-parameters">
      <name>Media Type Parameters</name>
      <t>While the media type <tt>application/json-structure</tt> does not have any parameters,
this specification defines a parameter applicable to all JSON documents.</t>
      <section anchor="schema-parameter">
        <name><tt>schema</tt> Parameter</name>
        <t>The <tt>schema</tt> parameter is used to reference a JSON Structure document that
defines the structure of the JSON document. The value of the <tt>schema</tt> parameter
<bcp14>MUST</bcp14> be a URI that references and ideally resolves to a JSON Structure document.</t>
        <t>The <tt>schema</tt> parameter <bcp14>MAY</bcp14> be used in conjunction with the <tt>application/json</tt>
media type or the <tt>+json</tt> structured syntax suffix or any other media type that
is known to be encoded as JSON.</t>
        <t>Example using the HTTP <tt>Content-Type</tt> header:</t>
        <sourcecode type="http"><![CDATA[
Content-Type: application/json; schema="https://schemas.vasters.com/TypeName"
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>JSON Structure documents are self-contained and <bcp14>MUST NOT</bcp14> allow external
references except for the <tt>$schema</tt> and <tt>$addins</tt> keywords. Implementations <bcp14>MUST</bcp14>
ensure that all <tt>$ref</tt> pointers resolve within the same document to eliminate
security vulnerabilities related to external schema inclusion.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA shall be requested to register the media type <tt>application/json-structure</tt>
as defined in this specification in the "Media Types" registry.</t>
      <t>IANA shall be requested to register the parameter <tt>schema</tt> for the
<tt>application/json</tt> media type in the "Media Type Structured Syntax Suffixes"
registry.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC9562">
          <front>
            <title>Universally Unique IDentifiers (UUIDs)</title>
            <author fullname="K. Davis" initials="K." surname="Davis"/>
            <author fullname="B. Peabody" initials="B." surname="Peabody"/>
            <author fullname="P. Leach" initials="P." surname="Leach"/>
            <date month="May" year="2024"/>
            <abstract>
              <t>This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9562"/>
          <seriesInfo name="DOI" value="10.17487/RFC9562"/>
        </reference>
        <reference anchor="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC1950">
          <front>
            <title>ZLIB Compressed Data Format Specification version 3.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <author fullname="J-L. Gailly" surname="J-L. Gailly"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1950"/>
          <seriesInfo name="DOI" value="10.17487/RFC1950"/>
        </reference>
        <reference anchor="RFC1951">
          <front>
            <title>DEFLATE Compressed Data Format Specification version 1.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1951"/>
          <seriesInfo name="DOI" value="10.17487/RFC1951"/>
        </reference>
        <reference anchor="RFC1952">
          <front>
            <title>GZIP file format specification version 4.3</title>
            <author fullname="P. Deutsch" initials="P." surname="Deutsch"/>
            <date month="May" year="1996"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that is compatible with the widely used GZIP utility. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1952"/>
          <seriesInfo name="DOI" value="10.17487/RFC1952"/>
        </reference>
        <reference anchor="RFC7932">
          <front>
            <title>Brotli Compressed Data Format</title>
            <author fullname="J. Alakuijala" initials="J." surname="Alakuijala"/>
            <author fullname="Z. Szabadka" initials="Z." surname="Szabadka"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This specification defines a lossless compressed data format that compresses data using a combination of the LZ77 algorithm and Huffman coding, with efficiency comparable to the best currently available general-purpose compression methods.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7932"/>
          <seriesInfo name="DOI" value="10.17487/RFC7932"/>
        </reference>
        <reference anchor="JSTRUCT-ALTNAMES" target="https://json-structure.github.io/alternate-names">
          <front>
            <title>JSON Structure Alternate Names</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-COMPOSITION" target="https://json-structure.github.io/conditional-composition">
          <front>
            <title>JSON Structure Conditional Composition</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-IMPORT" target="https://json-structure.github.io/import">
          <front>
            <title>JSON Structure Import</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-UNITS" target="https://json-structure.github.io/units">
          <front>
            <title>JSON Structure Units</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="JSTRUCT-VALIDATION" target="https://json-structure.github.io/validation">
          <front>
            <title>JSON Structure Validation</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 1844?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Lp3KXgNt0aRXDE56r4e7PopY0ark+Ik5kx1v/hK5RVxeT1MNkUgwIoMNWeU1
SJsneJEiLc3APsefEvlpBU61Ca8dDtxrm93hKC2MgcHXizKJATSMRAvfmV1i
OlLbzhitsBy64+ruvbv3Ly+1sBTW57x3V6o+WbCp8KteZ4lWMrf06on7uCmz
9b+Hxp0utu+t+/32vc7HGJiw3sd3dno+Pkverv89NLbq2brMyD07W5uJQz8Q
SvpdGEJLjO6SY+Uexpz6X1fwpmkFm9lpUcJGNPdiPGRXkPAU26Nwqjjsg2e9
Rf8eHByMAkys3Hr6XboYIJdOMrhpAdv7KU8iUJaQCLQOth98sXN56Qqg4WVs
1+laPlnR+7b2/l2WHl+na2y/ot/b2u9xWdRZep2e+Yuhvr98cIcx8sOxtjrt
HDnxN6TKSqZ/hrXCDltH+vIb1xFrH++3NDdsY075h8WxGckzMyW+X4+bvbnS
7bgdxGugiysjnjGAAhMM79+5/1GoMFeQyJCegyp4a9GJAnDlNDv2QaCVh9ZB
+E3HNnDhxlhnNef7FBWfYYwEKxVLvnnAZcLgCdirJ49ePHv25PnjJ485UDWL
gYOXoaofxDXb5HX3OmCalz5B5qyZx/m4TMBwwaME80VfnMikO5w/Vvc5HO6M
2hWUyDtBIe+tOJvB8bc9FKjwzd9ynHtAVYw7mTdZnY4z+L7BS3n9x3Jy2hu7
g+s2Jm+tzyXKsSKuhvSY2yMx5IWDxl15GTMIah8EAp78ZjFCcdo21MRUDbx8
+q6fblrONjyFkEPWVpiWetXCodYi26LAFZ3C7FoDfYDHXQAgr7v8QX53eW7F
TwKKnijSOb5rbzYb71OMn6NGBdb7bAzG8TjNK++Q0SLaHL3erbSPmg4xPUqu
Eq+Tkugx1/HI3UKK+wjIFLCV2BU8hm2ELrkYA4OclvF8jlpyVS+JKGdgLjC6
Ls7SjMKFNzdk36cQ8+aYBloU2XJelIszTFCTK+LwR8oqEdGq18pQcSEUzmBc
Y0gbNvHV9+VuKLrGnXzg50UKEzTuA2TpLHmbskMdq9jydVGbG2lVNVQ8qb5I
EsluFCfMKDLTs5Y7ujkQDBep8kaQpueRb9p3bbTIUSUlpo87HZMLtHqSctCY
u60iNvX030iB5Tdql7src45BgL4JCky/ocHe9NVnfhOdw27k2YJzH33nnF3h
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

-->

</rfc>
