<?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-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>JSON Structure: Validation Extensions</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-validation-00"/>
    <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 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 Extnensions</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="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
z4TD7P8Aexuuhq40AAA=

-->

</rfc>
