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

<t>The JSON Structure Validation extension provides schema authors with additional
means to constrain instance data. These keywords are applied in conjunction with
the constructs defined in JSON Structure Core. The keywords defined herein include
numeric, string, array, and object validation keywords as well as conditional
validations.</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/validation/draft-vasters-json-structure-validation.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vasters-json-structure-validation/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/json-structure/validation"/>.</t>
    </note>
  </front>
  <middle>
    <?line 58?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The JSON Structure Validation extension provides schema authors with additional
means to constrain instance data. These keywords are applied in conjunction with
the constructs defined in JSON Structure Core
<xref target="JSTRUCT-CORE"/>. The keywords defined herein include
numeric, string, array, and object validation keywords as well as conditional
validations.</t>
      <t>For each keyword, this document specifies its applicability, the permitted value
types, and the related standards that must be observed.</t>
    </section>
    <section anchor="conventions">
      <name>Conventions</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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.
<?line -6?>
      </t>
    </section>
    <section anchor="validation-keywords">
      <name>Validation Keywords</name>
      <section anchor="numeric-validation-keywords">
        <name>Numeric Validation Keywords</name>
        <t>This section defines the validation keywords applicable to schemas with numeric
types. The value of each keyword MUST be in the value space of the numeric type
to which the keyword is applied.</t>
        <t>For schemas with extended numeric types (such as long integers and decimals)
whose base representation is a string, numeric constraint values (e.g., for
<tt>minimum</tt>, <tt>maximum</tt>) MUST be provided as strings.</t>
        <section anchor="minimum">
          <name><tt>minimum</tt></name>
          <t>An instance is valid if its numeric value is greater than or equal to the value
specified in <tt>minimum</tt>.</t>
          <t>Example for basic type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "number", "minimum": 10 }
]]></sourcecode>
          <t>Example for extended type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "decimal", "minimum": "10.00" }
]]></sourcecode>
        </section>
        <section anchor="maximum">
          <name><tt>maximum</tt></name>
          <t>An instance is valid if its numeric value is less than or equal to the value
specified in <tt>maximum</tt>.</t>
          <t>Example for basic type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "number", "maximum": 100 }
]]></sourcecode>
          <t>Example for extended type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "decimal", "maximum": "100.00" }
]]></sourcecode>
        </section>
        <section anchor="exclusiveMinimum">
          <name><tt>exclusiveMinimum</tt></name>
          <t>An instance is valid if its numeric value is strictly greater than the value
specified in <tt>exclusiveMinimum</tt>.</t>
          <t>Example for basic type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "number", "exclusiveMinimum": 10 }
]]></sourcecode>
          <t>Example for extended type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "int64", "exclusiveMinimum": "10" }
]]></sourcecode>
        </section>
        <section anchor="exclusiveMaximum">
          <name><tt>exclusiveMaximum</tt></name>
          <t>An instance is valid if its numeric value is strictly less than the value
specified in <tt>exclusiveMaximum</tt>.</t>
          <t>Example for basic type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "number", "exclusiveMaximum": 100 }
]]></sourcecode>
          <t>Example for extended type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "decimal", "exclusiveMaximum": "100.00" }
]]></sourcecode>
        </section>
        <section anchor="multipleOf">
          <name><tt>multipleOf</tt></name>
          <t>An instance is valid if dividing its numeric value by the value of <tt>multipleOf</tt>
results in an integer value. The value of <tt>multipleOf</tt> MUST be a positive
number.</t>
          <t>Example for basic type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "number", "multipleOf": 5 }
]]></sourcecode>
          <t>Example for extended type:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "decimal", "multipleOf": "5" }
]]></sourcecode>
        </section>
      </section>
      <section anchor="string-validation-keywords">
        <name>String Validation Keywords</name>
        <t>This section defines the validation keywords applicable to schemas with the type
<tt>string</tt>. The <tt>maxLength</tt> keyword is not included as it is part of JSON
Structure Core and is not redefined here.</t>
        <section anchor="minLength">
          <name><tt>minLength</tt></name>
          <t>A string is valid if its length is at least the integer value specified in
<tt>minLength</tt>. The value of <tt>minLength</tt> MUST be a non-negative integer.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "string", "minLength": 3 }
]]></sourcecode>
        </section>
        <section anchor="pattern">
          <name><tt>pattern</tt></name>
          <t>A string is valid if its entire value conforms to the regular expression
provided in the <tt>pattern</tt> keyword. The value of <tt>pattern</tt> MUST be a string
representing a valid regular expression that conforms to the <xref target="ECMA_262_2022"/> standard.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "string", "pattern": "^[A-Z][a-z]+$" }
]]></sourcecode>
        </section>
        <section anchor="format">
          <name><tt>format</tt></name>
          <t>A string is valid if it conforms to a specific format. The value of <tt>format</tt>
MUST be a string. The <tt>format</tt> keyword adds additional standard validation
constraints not covered by the extended types in the core specification without
the need to define an explicit regular expression <tt>pattern</tt>.</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipv4</tt> – Internet Protocol version 4 address</t>
            </li>
            <li>
              <t><tt>ipv6</tt> – Internet Protocol version 6 address</t>
            </li>
            <li>
              <t><tt>email</tt> – Email address</t>
            </li>
            <li>
              <t><tt>idn-email</tt> – Internationalized email address</t>
            </li>
            <li>
              <t><tt>hostname</tt> – Hostname</t>
            </li>
            <li>
              <t><tt>idn-hostname</tt> – Internationalized hostname</t>
            </li>
            <li>
              <t><tt>iri</tt> – Internationalized Resource Identifier</t>
            </li>
            <li>
              <t><tt>iri-reference</tt> – Internationalized Resource Identifier reference</t>
            </li>
            <li>
              <t><tt>uri-template</tt> – URI template</t>
            </li>
            <li>
              <t><tt>relative-json-pointer</tt> – Relative JSON pointer</t>
            </li>
            <li>
              <t><tt>regex</tt> – Regular expression</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="array-and-set-validation-keywords">
        <name>Array and Set Validation Keywords</name>
        <t>This section defines the validation keywords applicable to schemas with the type
<tt>array</tt> and <tt>set</tt>.</t>
        <section anchor="minItems">
          <name><tt>minItems</tt></name>
          <t>An array or set is valid if its number of elements is at least the integer value
specified in <tt>minItems</tt>. The value of <tt>minItems</tt> MUST be a non-negative integer.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "minItems": 2 }
]]></sourcecode>
        </section>
        <section anchor="maxItems">
          <name><tt>maxItems</tt></name>
          <t>An array or set is valid if its number of elements does not exceed the integer
value specified in <tt>maxItems</tt>. The value of <tt>maxItems</tt> MUST be a non-negative
integer.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "maxItems": 10 }
]]></sourcecode>
        </section>
        <section anchor="uniqueItems">
          <name><tt>uniqueItems</tt></name>
          <t>This keyword is only applicable to schemas with the type <tt>array</tt> as this
constraint is inherent to <tt>set</tt>. An array is valid if, when <tt>uniqueItems</tt> is set
to true, no two elements are equal. The value of <tt>uniqueItems</tt> MUST be a boolean
(either true or false).</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "uniqueItems": true }
]]></sourcecode>
        </section>
        <section anchor="contains">
          <name><tt>contains</tt></name>
          <t>An array or set is valid if at least one element satisfies the schema specified
in <tt>contains</tt>. The value of <tt>contains</tt> MUST be a valid JSON Structure object.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "contains": { "type": "string" } }
]]></sourcecode>
          <t>The condition schema MAY contain a <tt>const</tt> keyword to specify a fixed value that
the array must contain.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "contains": { "type": "string", "const": "foo" } }
]]></sourcecode>
        </section>
        <section anchor="maxContains">
          <name><tt>maxContains</tt></name>
          <t>An array or set is valid if at most the number of elements specified in
<tt>maxContains</tt> satisfy the schema specified in <tt>contains</tt>. The value of
<tt>maxContains</tt> MUST be a non-negative integer.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "contains": { "type": "string" }, "maxContains": 2 }
]]></sourcecode>
        </section>
        <section anchor="minContains">
          <name><tt>minContains</tt></name>
          <t>An array or set is valid if at least the number of elements specified in
<tt>minContains</tt> satisfy the schema specified in <tt>contains</tt>. The value of
<tt>minContains</tt> MUST be a non-negative integer.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "array", "contains": { "type": "string" }, "minContains": 2 }
]]></sourcecode>
        </section>
      </section>
      <section anchor="object-and-map-validation-keywords">
        <name>Object and Map Validation Keywords</name>
        <t>This section defines the validation keywords applicable to schemas with the type
<tt>object</tt> and <tt>map</tt>.</t>
        <section anchor="minProperties-and-minEntries">
          <name><tt>minProperties</tt> and <tt>minEntries</tt></name>
          <t>An object is valid if it has at least as many properties as defined by the
integer value specified in <tt>minProperties</tt>. The value of <tt>minProperties</tt> MUST be
a non-negative integer. The <tt>minEntries</tt> keyword applies equivalently to <tt>map</tt>
types.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "object", "minProperties": 1 }
]]></sourcecode>
          <t>This constraint is useful for <tt>object</tt> definitions that use dynamic properties
via <tt>additionalProperties</tt> and <tt>patternProperties</tt>.</t>
        </section>
        <section anchor="maxProperties-and-maxEntries">
          <name><tt>maxProperties</tt> and <tt>maxEntries</tt></name>
          <t>An object is valid if it contains no more than the integer value specified in
<tt>maxProperties</tt>. The value of <tt>maxProperties</tt> MUST be a non-negative integer.
The <tt>maxEntries</tt> keyword applies equivalently to <tt>map</tt> types.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{ "type": "object", "maxProperties": 5 }
]]></sourcecode>
        </section>
        <section anchor="dependentRequired">
          <name><tt>dependentRequired</tt></name>
          <t>This keyword establishes dependencies between object properties. The value is a
map of arrays of strings. Each entry in the map corresponds to a property name
in the object instance. If the property exists, then the properties listed in
the corresponding array MUST also exist in the instance. This keyword does not
apply to the <tt>map</tt> type.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": { "type": "string" },
    "credit_card": { "type": "number" },
    "billing_address": { "type": "string" }
  },
  "dependentRequired": {
    "credit_card": ["billing_address"]
  },
  "required": ["name"]
}
]]></sourcecode>
        </section>
        <section anchor="patternProperties-and-patternKeys">
          <name><tt>patternProperties</tt> and <tt>patternKeys</tt></name>
          <t>This keyword applies validation schemas to the <strong>values</strong> of properties whose
names match specified regular expressions. It does not define or declare
properties; rather, it constrains the values of any properties that happen to
match the given patterns.</t>
          <t>For each property in the object instance, if its name matches a regular
expression defined in <tt>patternProperties</tt>, then its value MUST validate against
the corresponding schema. The property names used as keys in
<tt>patternProperties</tt> MUST be strings representing valid regular expressions
conforming to the <xref target="ECMA_262_2022"/> standard. The <tt>patternKeys</tt> keyword applies
equivalently to <tt>map</tt> types.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "patternProperties": {
    "^[A-Z]": { "type": "string" }
  }
}
]]></sourcecode>
          <ul empty="true">
            <li>
              <t><strong>Note:</strong> All identifiers are additionally subject to the constraints of the
identifier syntax in JSON Structure Core
<xref target="JSTRUCT-CORE"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="propertyNames-and-keyNames">
          <name><tt>propertyNames</tt> and <tt>keyNames</tt></name>
          <t>The <tt>propertyNames</tt> keyword constrains the <strong>names</strong> of all properties in an
object. Unlike <tt>patternProperties</tt>, which validates property values based on
name patterns, <tt>propertyNames</tt> validates the names themselves against a
<tt>string</tt>-typed schema. An object is valid only if every property name in the
object satisfies the given schema. The schema MUST be of type <tt>string</tt>. The
<tt>keyNames</tt> keyword applies equivalently to <tt>map</tt> types.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "propertyNames": { "type": "string", "pattern": "^[a-z][a-zA-Z0-9]*$" }
}
]]></sourcecode>
        </section>
        <section anchor="has">
          <name><tt>has</tt></name>
          <t>The <tt>has</tt> keyword validates that an object or map has at least one value
that matches the schema. The schema MUST be of type <tt>object</tt>.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "has": { "type": "string" }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="default-values">
        <name>Default Values</name>
        <section anchor="default">
          <name><tt>default</tt></name>
          <t>The <tt>default</tt> keyword provides a default value for a schema. If an instance
matches the schema but does not contain the property, the default value is used.</t>
          <t>Example:</t>
          <sourcecode type="json"><![CDATA[
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "default": "John Doe"
    }
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="enabling-the-extensions">
        <name>Enabling the Extensions</name>
        <t>Validation extensions can be enabled in a schema or
meta-schema by adding <tt>JSONSchemaValidation</tt> to the <tt>$uses</tt>
array when referencing the extended meta-schema:</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/extended/v0/#",
  "$id": "myschema",
  "$uses": [
    "JSONSchemaValidation"
  ],
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[A-Z][a-z]+$"
    }
  }
}
]]></sourcecode>
        <t>The extensions are enabled by default in the validation meta-schema:</t>
        <sourcecode type="json"><![CDATA[
{
  "$schema": "https://json-structure.org/meta/validation/v0/#",
  "$id": "myschema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[A-Z][a-z]+$"
    }
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <t>Validators shall process each validation keyword independently and combine
results using a logical AND conjunction. Regular expression evaluation for
<tt>pattern</tt>, <tt>patternProperties</tt>, and <tt>propertyNames</tt> MUST conform to the
ECMAScript Language Specification <xref target="ECMA_262_2022"/>.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Complex regular expressions specified in <tt>pattern</tt>, <tt>patternProperties</tt>, and
<tt>propertyNames</tt> may lead to performance issues (e.g., ReDoS). Implementations
should mitigate such risks. Overly complex or deeply nested validation
constructs may impact performance and should be optimized.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <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="RFC5646">
        <front>
          <title>Tags for Identifying Languages</title>
          <author fullname="A. Phillips" initials="A." role="editor" surname="Phillips"/>
          <author fullname="M. Davis" initials="M." role="editor" surname="Davis"/>
          <date month="September" year="2009"/>
          <abstract>
            <t>This document describes the structure, content, construction, and semantics of language tags for use in cases where it is desirable to indicate the language used in an information object. It also describes how to register values for use in language tags and the creation of user-defined extensions for private interchange. 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="47"/>
        <seriesInfo name="RFC" value="5646"/>
        <seriesInfo name="DOI" value="10.17487/RFC5646"/>
      </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>
      <reference anchor="JSTRUCT-CORE" target="https://json-structure.github.io/core/draft-vasters-json-structure-core.html">
        <front>
          <title>JSON Structure Core</title>
          <author fullname="Clemens Vasters">
            <organization/>
          </author>
          <date>n.d.</date>
        </front>
      </reference>
      <reference anchor="ECMA_262_2022" target="https://www.ecma-international.org/publications-and-standards/standards/ecma-262/">
        <front>
          <title>ECMAScript® Language Specification</title>
          <author>
            <organization>Ecma International</organization>
          </author>
          <date year="2022"/>
        </front>
        <seriesInfo name="ECMA Standards" value="ECMA-262"/>
      </reference>
    </references>
    <?line 510?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-validation-01">
      <name>Changes from draft-vasters-json-structure-validation-01</name>
      <ul spacing="normal">
        <li>
          <t>Updated obsolete RFC 4646 reference to RFC 5646 (BCP 47).</t>
        </li>
        <li>
          <t>Fixed terminology: <tt>$uses</tt> is an array, not a "clause"; entries are not
"keys".</t>
        </li>
        <li>
          <t>Removed awkward parenthetical "(property)" in <tt>has</tt> keyword definition.</t>
        </li>
        <li>
          <t>Clarified roles of <tt>patternProperties</tt>/<tt>patternKeys</tt> vs
<tt>propertyNames</tt>/<tt>keyNames</tt>: the former validates property values by name
pattern, the latter validates names themselves.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="changes-from-draft-vasters-json-structure-validation-00">
      <name>Changes from draft-vasters-json-structure-validation-00</name>
      <ul spacing="normal">
        <li>
          <t>Fixed typo in "Enabling the Extensions" section title.</t>
        </li>
        <li>
          <t>Fixed invalid JSON in example (removed trailing comma).</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
AM3Z6++AOAAA

-->

</rfc>
