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

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

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

</section>
    <section anchor="json-structure-core-specification">
      <name>JSON Structure Core Specification</name>
      <section anchor="schema-elements">
        <name>Schema Elements</name>
        <section anchor="schema">
          <name>Schema</name>
          <t>A "schema" is a JSON object that describes, constrains, and interprets a JSON
node.</t>
          <t>This schema constrains a JSON node to be of type <tt>string</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "string"
}
]]></sourcecode>
          <t>In the case of a schema that references a compound type (<tt>object</tt>, <tt>set</tt>,
<tt>array</tt>, <tt>map</tt>, <tt>tuple</tt>, <tt>choice</tt>), the schema further describes the structure
of the compound type. Schemas can be placed into a namespace (<xref target="namespaces"/>)
for reuse in other schemas.</t>
          <sourcecode type="json"><![CDATA[
{
  "name": "myname",
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  }
}
]]></sourcecode>
          <t>All schemas have an associated name that serves as an identifier. In the example
above where the schema is a root object, the name is the value of the <tt>name</tt>
property.</t>
          <t>When the schema is placed into a namespace (<xref target="namespaces"/>) or embedded into a
properties (<xref target="properties-keyword"/>) section of an <tt>object</tt> type, the name is the
key under which the schema is stored.</t>
          <t>Further rules for schemas are defined in <xref target="type-system-rules"/>.</t>
          <t>A "schema document" is a schema that represents the root of a schema hierarchy
and is the container format in which schemas are stored on disk or exchanged. A
schema document <bcp14>MAY</bcp14> contain multiple type declarations and namespaces. The
structure of schema documents is defined in <xref target="document-structure"/>.</t>
          <t>JSON Structure is extensible. All keywords that are not explicitly defined in
this document <bcp14>MAY</bcp14> be used for custom annotations and extensions. This also
applies to keywords that begin with the <tt>$</tt> character. A complete list of
reserved keywords is provided in <xref target="reserved-keywords"/>.</t>
          <t>The semantics of keywords defined in this document <bcp14>MAY</bcp14> be expanded by extension
specifications, but the core semantics of the keywords defined in this document
<bcp14>MUST NOT</bcp14> be altered.</t>
          <t>Be mindful that the use of custom keywords and annotations might conflict with
future versions of this specification or other extensions and that the authors
of this specification will not go out of their way to avoid such conflicts.</t>
          <t><xref target="extensions-and-add-ins"/> details the extensibility features.</t>
          <t>Formally, a schema is a constrained non-schema (<xref target="non-schema"/>) that requires a
type (<xref target="type-keyword"/>) keyword or a <tt>$ref</tt> (<xref target="ref-keyword"/>) keyword to be a
schema.</t>
        </section>
        <section anchor="non-schema">
          <name>Non-Schema</name>
          <t>Non-schemas are objects that do not declare or refer to a type. The root of a
schema document (<xref target="document-structure"/>) is a non-schema unless it contains a
<tt>type</tt> keyword.</t>
          <t>A namespace is a non-schema that contains type declarations and other
namespaces.</t>
        </section>
        <section anchor="meta-schemas">
          <name>Meta-Schemas</name>
          <t>A meta-schema is a schema document that defines the structure and constraints of
another schema document. Meta-schemas are used to validate schema documents and
to ensure that schemas are well-formed and conform to the JSON Structure
specification.</t>
          <t>The meta-schemas for JSON Structure and the extension specifications are
enumerated in the Appendix: Metaschemas (<xref target="schema"/>).</t>
          <t>Meta-schemas can extend existing meta-schemas by adding new keywords or
constraints. The <tt>$schema</tt> keyword is used to reference the meta-schema that a
schema document conforms to, the <tt>$id</tt> keyword is used to define the identifier
of the new meta-schema, and the <tt>$import</tt> keyword defined in the
<xref target="JSTRUCT-IMPORT"/> extension specification is used to import all definitions
from the foundational meta-schema.</t>
        </section>
      </section>
      <section anchor="data-types">
        <name>Data Types</name>
        <t>The data types that can be used with the <tt>type</tt> keyword are categorized into
JSON primitive types, extended types, compound types, and reusable types
<xref target="reusable-types"/>.</t>
        <t>While JSON Structure builds on the JSON data type model, it introduces a rich
set of types to represent structured data more accurately and to allow more
precise integration with common data types used in programming languages and
data formats. All these extended types have a well-defined representation in
JSON primitive types.</t>
        <section anchor="json-primitive-types">
          <name>JSON Primitive Types</name>
          <t>These types map directly to the underlying JSON representation:</t>
          <section anchor="string">
            <name><tt>string</tt></name>
            <t>A sequence of Unicode characters enclosed in double quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt> <xref section="7" sectionFormat="of" target="RFC8259"/></t>
              </li>
              <li>
                <t>Annotations: The <tt>maxLength</tt> keyword can be used on a schema with the <tt>string</tt>
type to specify the maximum length of the string. By default, the maximum
length is unlimited. The purpose of the keyword is to inform consumers of the
maximum space required to store the string.</t>
              </li>
            </ul>
          </section>
          <section anchor="number">
            <name><tt>number</tt></name>
            <t>A numeric literal without quotes.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>number</tt> <xref section="6" sectionFormat="of" target="RFC8259"/></t>
              </li>
            </ul>
            <t>Note that the <tt>number</tt> representation in JSON is a textual representation of a
decimal number (base-10) and therefore cannot accurately represent all possible
values of IEE754 floating-point numbers (base-2), in spite of JSON <tt>number</tt>
leaning on the IEEE754 standard as a reference for the value space.</t>
          </section>
          <section anchor="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>time</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="duration">
            <name><tt>duration</tt></name>
            <t>A time duration.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3339"/> <tt>duration</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uuid">
            <name><tt>uuid</tt></name>
            <t>A universally unique identifier.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC9562"/> <tt>UUID</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="uri">
            <name><tt>uri</tt></name>
            <t>A URI reference, relative or absolute.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC3986"/> <tt>uri-reference</tt> format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
          <section anchor="jsonpointer">
            <name><tt>jsonpointer</tt></name>
            <t>A JSON Pointer reference.</t>
            <ul spacing="normal">
              <li>
                <t>Base type: <tt>string</tt></t>
              </li>
              <li>
                <t>Constraints:
                </t>
                <ul spacing="normal">
                  <li>
                    <t>The string value <bcp14>MUST</bcp14> conform to the <xref target="RFC6901"/> JSON Pointer format.</t>
                  </li>
                </ul>
              </li>
            </ul>
          </section>
        </section>
        <section anchor="compound-types">
          <name>Compound Types</name>
          <t>Compound types are used to structure related data elements. JSON Structure
supports the following compound types:</t>
          <section anchor="object">
            <name><tt>object</tt></name>
            <t>The <tt>object</tt> type is used to define structured data with named properties. It's
represented as a JSON object, which is an unordered collection of key–value
pairs.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>The <tt>object</tt> type <bcp14>MUST</bcp14> include a <tt>properties</tt> attribute that defines the
properties of the object. The <tt>properties</tt> attribute <bcp14>MUST</bcp14> be a JSON object where
each key is a property name and each value is a schema definition for the
property. The object <bcp14>MUST</bcp14> contain at least one property definition.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include a <tt>required</tt> attribute that defines the required
properties of the object.</t>
            <t>The <tt>object</tt> type <bcp14>MAY</bcp14> include an <tt>additionalProperties</tt> attribute that defines
whether additional properties are allowed and/or what their schema is.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "name": "Person",
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"],
  "additionalProperties": false
}
]]></sourcecode>
          </section>
          <section anchor="array">
            <name><tt>array</tt></name>
            <t>An <tt>array</tt> type is used to define an ordered collection of elements. It's
represented as a JSON array, which is an ordered list of values.</t>
            <t>The <tt>items</tt> attribute of an array <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t><strong>Examples:</strong></t>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="set">
            <name><tt>set</tt></name>
            <t>The <tt>set</tt> type is used to define an unordered collection of unique elements.
It's represented as a JSON array where all elements are unique.</t>
            <t>The <tt>items</tt> attribute of a <tt>set</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": { "$ref": "#/Namespace/TypeName" } }
}
]]></sourcecode>
            <sourcecode type="json"><![CDATA[
{
  "type": "set",
  "items": { "type": "string" }
}
]]></sourcecode>
          </section>
          <section anchor="map">
            <name><tt>map</tt></name>
            <t>The <tt>map</tt> type is used to define dynamic key–value pairs. It's represented as a
JSON object where the keys are strings and the values are of a specific type.</t>
            <t>Map keys <bcp14>MAY</bcp14> be any valid JSON string.</t>
            <t>The <tt>values</tt> attribute of a <tt>map</tt> <bcp14>MUST</bcp14> reference a reusable type or a primitive
type or a locally declared compound type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": { "$ref": "#/StringType" } }
}
]]></sourcecode>
          </section>
          <section anchor="tuple">
            <name><tt>tuple</tt></name>
            <t>The <tt>tuple</tt> type is used to define an ordered collection of elements with a
specific length. It's represented as a JSON array where each element is of a
specific type.</t>
            <t>The elements are defined using a <tt>properties</tt> map as with the <tt>object</tt>
(<xref target="object"/>) type and each element is named. This permits straightforward
mapping into application constructs. All declared properties of a <tt>tuple</tt> are
implicitly <bcp14>REQUIRED</bcp14>.</t>
            <t>The order of the elements in a tuple is declared using the <tt>tuple</tt> keyword
<xref target="tuple-keyword"/>, which is <bcp14>REQUIRED</bcp14>. The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> be a JSON array
of strings, where each declared property name <bcp14>MUST</bcp14> be an element of the array.
The order of the elements in the array defines the order of the properties in
the tuple.</t>
            <t>A <tt>tuple</tt> type <bcp14>MUST</bcp14> include a <tt>name</tt> attribute that defines the name of the
type.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "tuple",
  "name": "Person",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "tuple": ["name", "age"]
}
]]></sourcecode>
            <t>The following JSON node is an valid instance of the <tt>tuple</tt> type defined above:</t>
            <sourcecode type="json"><![CDATA[
["Alice", 42]
]]></sourcecode>
          </section>
          <section anchor="any">
            <name><tt>any</tt></name>
            <t>The <tt>any</tt> type is used to define a type that can be any JSON value, including
primitive types, compound types, and extended types.</t>
            <t>Example:</t>
            <sourcecode type="json"><![CDATA[
{
  "type": "any"
}
]]></sourcecode>
          </section>
          <section anchor="choice">
            <name><tt>choice</tt></name>
            <t>The <tt>choice</tt> type is used to define a "discriminated union" of types. A
choice is a set of types where only one type can be selected at a time and
where the selected type is determined by the value of a selector.</t>
            <t>The <tt>choice</tt> type can declare two variants of discriminated unions that
are represented differently in JSON:</t>
            <ul spacing="normal">
              <li>
                <t><em>Tagged unions</em>: The <tt>choice</tt> type is represented as a JSON object with a
single property whose name is the selector of the type as declared in the
<tt>choices</tt> (<xref target="choices-keyword"/>) map and whose value is of the selected type.</t>
              </li>
              <li>
                <t><em>Inline unions</em>: The <tt>choice</tt> type is represented as a JSON object of the
selected type with the selector as a property of the object.</t>
              </li>
            </ul>
            <section anchor="tagged-unions">
              <name>Tagged Unions</name>
              <t>A tagged union is declared as follows:</t>
              <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
              <t>The JSON node described by the schema above is a tagged union. For the
example, the following JSON node is a valid instance of the <tt>MyChoice</tt> type:</t>
              <sourcecode type="json"><![CDATA[
{
  "string": "Hello, world!"
}
]]></sourcecode>
              <t>or:</t>
              <sourcecode type="json"><![CDATA[
{
  "int32": 42
}
]]></sourcecode>
            </section>
            <section anchor="inline-unions">
              <name>Inline Unions</name>
              <t>Inline unions require for all type choices to extend a common base type.</t>
              <t>This is expressed by using the <tt>$extends</tt> (<xref target="extends-keyword"/>) keyword in the
<tt>choice</tt> declaration. The <tt>$extends</tt> keyword <bcp14>MUST</bcp14> refer to a schema that defines
the base type and the base type <bcp14>MUST</bcp14> be abstract.</t>
              <t>If <tt>$extends</tt> is present, the <tt>selector</tt> property declares the name of the
injected property that acts as the selector for the inline union. The
type of the selector property is <tt>string</tt>. The selector property <bcp14>MAY</bcp14>
shadow a property of the base type; in this case, the base type property
<bcp14>MUST</bcp14> be of type <tt>string</tt>.</t>
              <t>The selector is defined as a property of the base type and the value of the
selector property <bcp14>MUST</bcp14> be a string that matches the name of one of the
options in the <tt>choices</tt> map.</t>
              <t>Example:</t>
              <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "$id": "https://schemas.vasters.com/TypeName",
  "type": "choice",
  "$extends": "#/definitions/Address",
  "selector": "addressType",
  "choices": {
    "StreetAddress": { "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": "#/Namespace/TypeName" } ]
}
]]></sourcecode>
          <t>Union of a string and an <tt>int32</tt>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", "int32"]
}
]]></sourcecode>
          <t>A valid union of a string and a <tt>map</tt> of strings:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "map", "values": { "type": "string" } } ]
}
]]></sourcecode>
          <t>An inline definition of a compound type in a union is NOT permitted:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": ["string", { "type": "object", "properties": { "name": { "type": "string" } } } ]
}
]]></sourcecode>
        </section>
        <section anchor="prohibition-of-top-level-unions">
          <name>Prohibition of Top-Level Unions</name>
          <ul spacing="normal">
            <li>
              <t>The root of a JSON Structure document <bcp14>MUST NOT</bcp14> be an array.</t>
            </li>
            <li>
              <t>If a type union is desired as the type of the root of a document instance, the
<tt>$root</tt> keyword <bcp14>MUST</bcp14> be used to designate a type union as the root type.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="identifier-rules">
        <name>Identifier Rules</name>
        <t>All property names and type names <bcp14>MUST</bcp14> conform to the regular expression
<tt>[A-Za-z_][A-Za-z0-9_]*</tt>. They <bcp14>MUST</bcp14> begin with a letter or underscore and <bcp14>MAY</bcp14>
contain letters, digits, and underscores. Keys and type names are
case-sensitive.</t>
        <t>If names need to contain characters outside of this range, consider using the
<xref target="JSTRUCT-ALTNAMES"/> extension specification to define those.</t>
      </section>
      <section anchor="structural-keywords">
        <name>Structural Keywords</name>
        <section anchor="type-keyword">
          <name>The <tt>type</tt> Keyword</name>
          <t>Declares the type of a schema element as a primitive or compound type. The
<tt>type</tt> keyword <bcp14>MUST</bcp14> be present in every schema element. For unions, the value of
<tt>type</tt> <bcp14>MUST</bcp14> be an array of type references or primitive type names.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string"
}
]]></sourcecode>
        </section>
        <section anchor="properties-keyword">
          <name>The <tt>properties</tt> Keyword</name>
          <t><tt>properties</tt> defines the properties of an <tt>object</tt> type.</t>
          <t>The <tt>properties</tt> keyword <bcp14>MUST</bcp14> contain a map of property names mapped to schema
definitions.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="required-keyword">
          <name>The <tt>required</tt> Keyword</name>
          <t><tt>required</tt> defines the required properties of an <tt>object</tt> type. The <tt>required</tt>
keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt>.</t>
          <t>The value of the <tt>required</tt> keyword is a simple array of property names or an
array of arrays of property names.</t>
          <t>An array of arrays is used to define alternative sets of required properties.
When alternative sets are used, exactly one of the sets <bcp14>MUST</bcp14> match the
properties of the object, meaning they are mutually exclusive.</t>
          <t>Property names in the <tt>required</tt> array <bcp14>MUST</bcp14> be present in <tt>properties</tt>.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "age": { "type": "int32" }
  },
  "required": ["name"]
}
]]></sourcecode>
          <t>Example with alternative sets:</t>
          <t>Because the <tt>name</tt> property is required in both sets, the <tt>name</tt> property is
required in all objects. The <tt>fins</tt> property is required in the first set, and
the <tt>legs</tt> property is required in the second set. That means that an object
<bcp14>MUST</bcp14> have either <tt>fins</tt> or <tt>legs</tt> but not both.</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "fins": { "type": "int32" },
    "legs": { "type": "int32" },
    "wings": { "type": "int32" }
  },
  "required": [["name", "fins"], ["name", "legs"]]
}
]]></sourcecode>
        </section>
        <section anchor="items-keyword">
          <name>The <tt>items</tt> Keyword</name>
          <t>Defines the schema for elements in an <tt>array</tt> or <tt>set</tt> type. The value is a type
reference or a primitive type name or a locally declared compound type.</t>
          <t>Examples:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": { "$ref": "#/Namespace/TypeName" }}
}
]]></sourcecode>
          <sourcecode type="json"><![CDATA[
{
  "type": "array",
  "items": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="values-keyword">
          <name>The <tt>values</tt> Keyword</name>
          <t>Defines the schema for values in a <tt>map</tt> type.</t>
          <t>The <tt>values</tt> keyword <bcp14>MUST</bcp14> reference a reusable type or a primitive type or a
locally declared compound type.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "map",
  "values": { "type": "string" }
}
]]></sourcecode>
        </section>
        <section anchor="const-keyword">
          <name>The <tt>const</tt> Keyword</name>
          <t>Constrains the values of the JSON node described by the schema to a single,
specific value. The <tt>const</tt> keyword <bcp14>MUST</bcp14> appear only in schemas with a primitive
<tt>type</tt>, and the instance value <bcp14>MUST</bcp14> match the provided constant exactly.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "const": "example"
}
]]></sourcecode>
        </section>
        <section anchor="enum-keyword">
          <name>The <tt>enum</tt> Keyword</name>
          <t>Constrains a schema to match one of a specific set of values. The <tt>enum</tt> keyword
<bcp14>MUST</bcp14> appear only in schemas with a primitive <tt>type</tt>, and all values in the enum
array <bcp14>MUST</bcp14> match that type. Values <bcp14>MUST</bcp14> be unique.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "enum": ["value1", "value2", "value3"]
}
]]></sourcecode>
          <t>It is NOT permitted to use <tt>enum</tt> in conjunction with a type union in <tt>type</tt>.</t>
        </section>
        <section anchor="additionalproperties-keyword">
          <name>The <tt>additionalProperties</tt> Keyword</name>
          <t><tt>additionalProperties</tt> defines whether additional properties are allowed in an
<tt>object</tt> type and, optionally, what their schema is. The value <bcp14>MUST</bcp14> be a boolean
or a schema. If set to <tt>false</tt>, no additional properties are allowed. If
provided with a schema, each additional property <bcp14>MUST</bcp14> conform to it.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" }
  },
  "additionalProperties": false
}
]]></sourcecode>
        </section>
        <section anchor="choices-keyword">
          <name>The <tt>choices</tt> Keyword</name>
          <t><tt>choices</tt> defines the choices of a <tt>choice</tt> type. The value <bcp14>MUST</bcp14> be a map of
type names to schemas. Each type name <bcp14>MUST</bcp14> be unique within the <tt>choices</tt> map.</t>
          <t>The value of each type name <bcp14>MUST</bcp14> be a schema. Inline compound types are permitted.</t>
          <t>The <tt>choices</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t><strong>*Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "choice",
  "name": "MyChoice",
  "choices": {
    "string": { "type": "string" },
    "int32": { "type": "int32" }
  }
}
]]></sourcecode>
        </section>
        <section anchor="selector-keyword">
          <name>The <tt>selector</tt> Keyword</name>
          <t>The <tt>selector</tt> keyword defines the name of the property that acts as the selector
for the type in a <tt>choice</tt> type. The value of <tt>selector</tt> <bcp14>MUST</bcp14> be a string.</t>
          <t>The <tt>selector</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>choice</tt> (<xref target="choice"/>).</t>
          <t>See <tt>choice</tt> (<xref target="choice"/>) for an example.</t>
        </section>
        <section anchor="tuple-keyword">
          <name>The <tt>tuple</tt> Keyword</name>
          <t>The <tt>tuple</tt> keyword defines the order of properties in a <tt>tuple</tt> type. The
value of <tt>tuple</tt> <bcp14>MUST</bcp14> be an array of strings, where each string is the name of a
property defined in the <tt>properties</tt> map. The order of the strings in the array
defines the order of the properties in the tuple.</t>
          <t>The <tt>tuple</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>tuple</tt> (<xref target="tuple"/>).</t>
          <t>See <tt>tuple</tt> (<xref target="tuple"/>) for an example.</t>
        </section>
      </section>
      <section anchor="type-annotation-keywords">
        <name>Type Annotation Keywords</name>
        <t>Type annotation keywords provide additional metadata about the underlying type.
These keywords are used for documentation and validation of additional
constraints on types.</t>
        <section anchor="maxlength-keyword">
          <name>The <tt>maxLength</tt> Keyword</name>
          <t>Specifies the maximum allowed length for a string. The <tt>maxLength</tt> keyword <bcp14>MUST</bcp14>
be used only with <tt>string</tt> types, and the string’s length <bcp14>MUST</bcp14> not exceed this
value.</t>
          <t>The purpose of <tt>maxLength</tt> is to provide a known storage constraint on the
maximum length of a string. The value <bcp14>MAY</bcp14> be used for validation.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "maxLength": 255
}
]]></sourcecode>
        </section>
        <section anchor="precision-keyword">
          <name>The <tt>precision</tt> Keyword</name>
          <t>Specifies the total number of significant digits for numeric values. The
<tt>precision</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt> types.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "precision": 10
}
]]></sourcecode>
        </section>
        <section anchor="scale-keyword">
          <name>The <tt>scale</tt> Keyword</name>
          <t>Specifies the number of digits to the right of the decimal point for numeric
values. The <tt>scale</tt> keyword is used as an annotation for <tt>number</tt> or <tt>decimal</tt>
types to constrain the fractional part.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "decimal",
  "scale": 2
}
]]></sourcecode>
        </section>
        <section anchor="contentencoding-keyword">
          <name>The <tt>contentEncoding</tt> Keyword</name>
          <t>Specifies the encoding of a binary value. The <tt>contentEncoding</tt> keyword is used
as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentEncoding</tt> are defined in <xref target="RFC4648"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>base64</tt>: The binary value is encoded as a base64 string.</t>
            </li>
            <li>
              <t><tt>base64url</tt>: The binary value is encoded as a base64url string.</t>
            </li>
            <li>
              <t><tt>base16</tt>: The binary value is encoded as a base16 string.</t>
            </li>
            <li>
              <t><tt>base32</tt>: The binary value is encoded as a base32 string.</t>
            </li>
            <li>
              <t><tt>base32hex</tt>: The binary value is encoded as a base32hex string.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64"
}
]]></sourcecode>
        </section>
        <section anchor="contentcompression-keyword">
          <name>The <tt>contentCompression</tt> Keyword</name>
          <t>Specifies the compression algorithm used for a binary value before encoding. The
<tt>contentCompression</tt> keyword is used as an annotation for <tt>binary</tt> types.</t>
          <t>The permitted values for <tt>contentCompression</tt> are:</t>
          <ul spacing="normal">
            <li>
              <t><tt>gzip</tt>: The binary value is compressed using the gzip algorithm. See
<xref target="RFC1952"/>.</t>
            </li>
            <li>
              <t><tt>deflate</tt>: The binary value is compressed using the deflate algorithm. See
<xref target="RFC1951"/>.</t>
            </li>
            <li>
              <t><tt>zlib</tt>: The binary value is compressed using the zlib algorithm. See
<xref target="RFC1950"/>.</t>
            </li>
            <li>
              <t><tt>brotli</tt>: The binary value is compressed using the brotli algorithm. See
<xref target="RFC7932"/>.</t>
            </li>
          </ul>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "compression": "gzip"
}
]]></sourcecode>
        </section>
        <section anchor="contentmediatype-keyword">
          <name>The <tt>contentMediaType</tt> Keyword</name>
          <t>Specifies the media type of a binary value. The <tt>contentMediaType</tt> keyword is
used as an annotation for <tt>binary</tt> types.</t>
          <t>The value of <tt>contentMediaType</tt> <bcp14>MUST</bcp14> be a valid media type as defined in
<xref target="RFC6838"/>.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "binary",
  "encoding": "base64",
  "mediaType": "image/png"
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="documentation-keywords">
        <name>Documentation Keywords</name>
        <t>Documentation keywords provide descriptive information for schema elements. They
are <bcp14>OPTIONAL</bcp14> but <bcp14>RECOMMENDED</bcp14> for clarity.</t>
        <section anchor="description-keyword">
          <name>The <tt>description</tt> Keyword</name>
          <t>Provides a human-readable description of a schema element. The <tt>description</tt>
keyword <bcp14>SHOULD</bcp14> be used to document any schema element.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "description": "A person's name"
}
]]></sourcecode>
          <t>For multi-lingual descriptions, the <xref target="JSTRUCT-ALTNAMES"/> companion provides an
extension to define several concurrent descriptions in multiple languages.</t>
        </section>
        <section anchor="examples-keyword">
          <name>The <tt>examples</tt> Keyword</name>
          <t>Provides example instance values that conform to the schema. The <tt>examples</tt>
keyword <bcp14>SHOULD</bcp14> be used to document potential instance values.</t>
          <t><strong>Example</strong>:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "string",
  "examples": ["example1", "example2"]
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="extensions-and-add-ins">
        <name>Extensions and Add-Ins</name>
        <t>The <tt>abstract</tt> and <tt>$extends</tt> keywords enable controlled type extension,
supporting basic object-oriented-programming-style inheritance while not
permitting subtype polymorphism where a sub-type value can be assigned a
base-typed property. This approach avoids validation complexities and mapping
issues between JSON schemas, programming types, and databases.</t>
        <t>An <em>extensible type</em> is declared as <tt>abstract</tt> and serves as a base for
extensions. For example, a base type <em>Address</em> <bcp14>MAY</bcp14> be extended by
<em>StreetAddress</em> and <em>PostOfficeBoxAddress</em> via <tt>$extends</tt>, but <em>Address</em> cannot
be used directly.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/core/v0/#",
  "definitions" : {
    "Address": {
      "abstract": true,
      "type": "object",
      "properties": {
          "city": { "type": "string" },
          "state": { "type": "string" },
          "zip": { "type": "string" }
      }
    },
    "StreetAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "street": { "type": "string" }
      }
    },
    "PostOfficeBoxAddress": {
      "type": "object",
      "$extends": "#/definitions/Address",
      "properties": {
          "poBox": { "type": "string" }
      }
    }
  }
}
]]></sourcecode>
        <t>A <em>add-in type</em> is declared as <tt>abstract</tt> and <tt>$extends</tt> a specific type that
does not need to be abstract. For example, an add-in type <em>DeliveryInstructions</em>
might be applied to any <em>StreetAddress</em> types in a document:</t>
        <sourcecode type="json"><![CDATA[
{
    "$schema": "https://json-structure.org/meta/core/v0/#",
    "$id": "https://schemas.vasters.com/Addresses",
    "$root": "#/definitions/StreetAddress",
    "$offers": {
        "DeliveryInstructions": "#/definitions/DeliveryInstructions"
    },
    "definitions" : {
      "StreetAddress": {
        "type": "object",
        "properties": {
            "street": { "type": "string" },
            "city": { "type": "string" },
            "state": { "type": "string" },
            "zip": { "type": "string" }
        }
      },
      "DeliveryInstructions": {
        "abstract": true,
        "type": "object",
        "$extends": "#/definitions/StreetAddress",
        "properties": {
            "instructions": { "type": "string" }
        }
      }
    }
}
]]></sourcecode>
        <t>Add-in types are options that a document author can enable for a schema. The
definitions of add-in types are not part of the main schema by default, but are
injected into the designated schema type when the document author chooses to use
them.</t>
        <t>Add-in types are advertised in the schema document through the <tt>$offers</tt>
keyword, which is a map that defines add-in names for add-in schema definitions
that exist in the document.</t>
        <t>Add-ins are applied to a schema by referencing the add-in name in the <tt>$uses</tt>
keyword that is available only in instance documents. The <tt>$uses</tt> keyword is a
set of add-in names that are applied to the schema for the document.</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://schemas.vasters.com/Addresses",
  "$uses": ["DeliveryInstructions"],
  "street": "123 Main St",
  "city": "Anytown",
  "state": "QA",
  "zip": "00001",
  "instructions": "Leave at the back door"
}
]]></sourcecode>
        <section anchor="abstract-keyword">
          <name>The <tt>abstract</tt> Keyword</name>
          <t>The <tt>abstract</tt> keyword declares a type as abstract. This prohibits its direct
use in any type declaration or as the type of a schema element. Abstract types
are used as base types for extension via <tt>$extends</tt> or as add-in types via
<tt>$addins</tt>.</t>
          <t>Abstract types implicitly permit additional properties (<tt>additionalProperties</tt>
is always <tt>true</tt>).</t>
          <ul spacing="normal">
            <li>
              <t><strong>Value</strong>: A boolean (<tt>true</tt> or <tt>false</tt>).</t>
            </li>
            <li>
              <t><strong>Rules</strong>:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The <tt>abstract</tt> keyword <bcp14>MUST</bcp14> only be used in schemas of type <tt>object</tt> and
<tt>tuple</tt>.</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MUST NOT</bcp14> be used as the type of a schema element or
referenced via <tt>$ref</tt>.</t>
                </li>
                <li>
                  <t>The <tt>additionalProperties</tt> keyword <bcp14>MUST NOT</bcp14> be used on abstract types (its
value is implicitly <tt>true</tt>).</t>
                </li>
                <li>
                  <t>Abstract types <bcp14>MAY</bcp14> extend other abstract types via <tt>$extends</tt>.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="extends-keyword">
          <name>The <tt>$extends</tt> Keyword</name>
          <t>The <tt>$extends</tt> keyword merges all properties from 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>
      </references>
    </references>
    <?line 1857?>

<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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
VINkOXz+6DnMXRuzM/H/AW7P50gl4wAA

-->

</rfc>
