<?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-validation-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: Validation Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-validation-01"/>
    <author fullname="Clemens Vasters">
      <organization>Microsoft Corporation</organization>
      <address>
        <email>clemensv@microsoft.com</email>
      </address>
    </author>
    <date year="2025" month="December" day="04"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 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 schemas to properties whose names match specified regular
expressions. 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 validates the names of all properties in an object
against a <tt>string</tt>-typed schema. An object is valid if every property name in
the object is valid. 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 (property)
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 the <tt>JSONSchemaValidation</tt> key to the <tt>$uses</tt>
clause 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="RFC4646">
        <front>
          <title>Tags for Identifying Languages</title>
          <author fullname="A. Phillips" initials="A." surname="Phillips"/>
          <author fullname="M. Davis" initials="M." surname="Davis"/>
          <date month="September" year="2006"/>
          <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, in combination with RFC 4647, replaces RFC 3066, which replaced RFC 1766. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4646"/>
        <seriesInfo name="DOI" value="10.17487/RFC4646"/>
      </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 504?>

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

-->

</rfc>
