<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-vasters-json-structure-core-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.33.0 -->
  <front>
    <title>JSON Structure: Core</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-core-03"/>
    <author fullname="Clemens Vasters">
      <organization>Microsoft Corporation</organization>
      <address>
        <email>clemensv@microsoft.com</email>
      </address>
    </author>
    <date year="2025" month="December" day="04"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 71?>

<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 78?>

<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>
        <li>
          <t><em>JSON Structure: Relations</em> <xref target="JSTRUCT-RELATIONS"/>: Declares identity
constraints and inter-type relationships for objects and tuples.</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="integer">
            <name><tt>integer</tt></name>
            <t>An alias for <tt>int32</tt> (<xref target="int32"/>), provided for compatibility with JSON Schema.</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="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>full-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": "#/definitions/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": { "type": { "$ref": "#/definitions/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": { "type": { "$ref": "#/definitions/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 a 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 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": { "type": { "$ref": "#/definitions/StreetAddress" } },
    "PostOfficeBoxAddress": { "type": { "$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>integer</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": "#/definitions/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": "#/definitions/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 one or more abstract base
types 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, or an array of JSON Pointers to
abstract types.</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 or an array of valid
JSON Pointers that point to abstract types 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>
                <li>
                  <t>When multiple base types are specified, properties are merged in array
order. If multiple base types define a property with the same name, the
property from the first base type in the array takes precedence.</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>
        <reference anchor="JSTRUCT-RELATIONS" target="https://json-structure.github.io/relations">
          <front>
            <title>JSON Structure Relations</title>
            <author fullname="Clemens Vasters">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 1864?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-02">
      <name>Changes from draft-vasters-json-structure-core-02</name>
      <ul spacing="normal">
        <li>
          <t>Fixed grammar error ("an valid" → "a valid") in tuple example.</t>
        </li>
        <li>
          <t>Fixed awkward phrasing ("require for all" → "require all") in inline unions.</t>
        </li>
        <li>
          <t>Corrected RFC 3339 production name from <tt>time</tt> to <tt>full-time</tt>.</t>
        </li>
        <li>
          <t>Added JSON Structure Relations to companion specification references.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-01">
      <name>Changes from draft-vasters-json-structure-core-01</name>
      <ul spacing="normal">
        <li>
          <t>Fixed <tt>$ref</tt> paths in examples to correctly include <tt>#/definitions/</tt> prefix
for types defined in the definitions section.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="changes-from-draft-vasters-json-structure-core-00">
      <name>Changes from draft-vasters-json-structure-core-00</name>
      <ul spacing="normal">
        <li>
          <t>Added <tt>integer</tt> as an alias for <tt>int32</tt> to improve compatibility with
simple JSON Schema definitions and user habits.</t>
        </li>
        <li>
          <t>Updated the <tt>$extends</tt> keyword to accept either a single JSON Pointer
or an array of JSON Pointers, enabling multiple inheritance for object
and tuple types.</t>
        </li>
        <li>
          <t>Fixed inconsistent <tt>$ref</tt> usage in examples throughout the document.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
