<?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-02" 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-02"/>
    <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 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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
gYA4AAA=

-->

</rfc>
