<?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-cond-composition-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: Conditional Composition</title>
    <seriesInfo name="Internet-Draft" value="draft-vasters-json-structure-cond-composition-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 42?>

<t>This document specifies JSON Structure Conditional Composition, an extension to
JSON Structure Core that introduces composition constructs for combining multiple
schema definitions. In particular, this specification defines the semantics,
syntax, and constraints for the keywords <tt>allOf</tt>, <tt>anyOf</tt>, <tt>oneOf</tt>, and <tt>not</tt>,
as well as the <tt>if</tt>/<tt>then</tt>/<tt>else</tt> conditional construct.</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/conditional-composition/draft-vasters-json-structure-cond-composition.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-vasters-json-structure-cond-composition/"/>.
      </t>
      <t>
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/json-structure/conditional-composition"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies JSON Structure Conditionals, an extension to JSON Structure Core <xref target="JSTRUCT-CORE"/> that introduces conditional composition constructs for combining multiple schema definitions. In particular, this specification defines the semantics, syntax, and constraints for the keywords <tt>allOf</tt>, <tt>anyOf</tt>, <tt>oneOf</tt>, and <tt>not</tt>, as well as the <tt>if</tt>/<tt>then</tt>/<tt>else</tt> conditional construct.</t>
    </section>
    <section anchor="terminology-and-conventions">
      <name>Terminology and Conventions</name>
      <t>The key words MUST, MUST NOT, SHALL, SHALL NOT, REQUIRED, SHOULD, and OPTIONAL are to be interpreted as described in <xref target="RFC2119"/> and <xref target="RFC8174"/>.</t>
      <t>Unless otherwise specified, all references to "non-schema" refer to a JSON Structure Core non-schema object, which is an inert JSON object that does not declare a type constraint.</t>
    </section>
    <section anchor="composition-and-evaluation-model">
      <name>Composition and Evaluation Model</name>
      <t>The keywords introduced in this document extend the set of keywords allowed for non-schemas and schemas as defined in JSON Structure Core. In particular, the keywords defined herein MAY extend all non-schema and schema definitions.</t>
      <t>The focus of JSON Structure Core is on data definitions. The conditional composition keywords introduced in this document allow authors to define conditional matching rules that use these fundamental data definitions.</t>
      <t>A schema document using these keywords is not a data definition but a rule set for evaluating JSON node instances against schema definitions and lays the groundwork for validation.</t>
      <t>Fundamentally, evaluating a JSON node against a schema involves matching the node against the schema's constraints.</t>
      <t>The outcome of evaluating a JSON node against a schema is ultimately a boolean value that states whether the node met all constraints defined in the schema. The evaluation also creates an understanding of which constraint was met for each subschema during evaluation.</t>
      <t>A schema evaluation engine traverses the given JSON node and the schema definition, evaluating the node and the schema recursively. When a conditional composition keyword is encountered, the engine evaluates each subschema independently against the current node and then combines the results as specified by the composition keyword.</t>
    </section>
    <section anchor="conditional-composition-keywords">
      <name>Conditional Composition Keywords</name>
      <t>This section defines several composition keywords that combine schema definitions with evaluation rules. Each keyword has a specific evaluation semantics that determines the outcome of the validation process.</t>
      <section anchor="allOf">
        <name><tt>allOf</tt></name>
        <t>The value of the <tt>allOf</tt> keyword MUST be a type-union array containing at least one schema object. A JSON node is valid against <tt>allOf</tt> if and only if it is valid against every schema in the array.</t>
        <t>Consider the following non-schema, which does not define its own type but rather contains an <tt>allOf</tt> keyword with three subschemas:</t>
        <sourcecode type="json"><![CDATA[
{
  "allOf": [
    {
      "type": "object",
      "properties": {
        "a": { "type": "string" }
      },
      "required": ["a"],
      "additionalProperties": true
    },
    {
      "type": "object",
      "properties": {
        "b": { "type": "number" }
      },
      "required": ["b"],
      "additionalProperties": true
    },
    {
      "type": "object",
      "properties": {
        "c": { "type": "boolean" }
      },
      "required": ["c"],
      "additionalProperties": true
    }
  ]
}
]]></sourcecode>
        <t>Here, a JSON node evaluates to <tt>true</tt> if it is an object with at least three properties <tt>a</tt>, <tt>b</tt>, and <tt>c</tt>, where <tt>a</tt> is a string, <tt>b</tt> is a number, and <tt>c</tt> is a boolean:</t>
        <sourcecode type="json"><![CDATA[
{
  "a": "string",
  "b": 42,
  "c": true
}
]]></sourcecode>
        <t>The JSON node satisfies all constraints defined by all subschemas. Conflicting constraints among subschemas result in an unsatisfiable schema—for example, if two subschemas require the same property to have different types or if one of the subschemas has <tt>additionalProperties</tt> set to <tt>false</tt>.</t>
      </section>
      <section anchor="anyOf">
        <name><tt>anyOf</tt></name>
        <t>The value of the <tt>anyOf</tt> keyword MUST be a type-union array containing at least one schema object. A JSON node is valid against <tt>anyOf</tt> if and only if it is valid against at least one of the schemas in the array.</t>
        <t>Consider the following schema:</t>
        <sourcecode type="json"><![CDATA[
{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "a": { "type": "string" }
      },
      "required": ["a"],
      "additionalProperties": true
    },
    {
      "type": "object",
      "properties": {
        "b": { "type": "number" }
      },
      "required": ["b"],
      "additionalProperties": true
    },
    {
      "type": "object",
      "properties": {
        "c": { "type": "boolean" }
      },
      "required": ["c"],
      "additionalProperties": true
    }
  ]
}
]]></sourcecode>
        <t>Here, a JSON node evaluates to <tt>true</tt> if it is an object with at least one of the properties <tt>a</tt>, <tt>b</tt>, or <tt>c</tt>, where <tt>a</tt> is a string, <tt>b</tt> is a number, and <tt>c</tt> is a boolean:</t>
        <sourcecode type="json"><![CDATA[
{
  "a": "string"
}
]]></sourcecode>
        <t>or</t>
        <sourcecode type="json"><![CDATA[
{
  "b": 42,
  "c": true
}
]]></sourcecode>
        <t>Both JSON nodes satisfy the constraints defined by at least one subschema.</t>
      </section>
      <section anchor="oneOf">
        <name><tt>oneOf</tt></name>
        <t>The value of the <tt>oneOf</tt> keyword MUST be a type-union array containing at least one schema object. A JSON node is valid against <tt>oneOf</tt> if and only if it is valid against exactly one of the schemas in the array.</t>
        <t>Consider the following schema:</t>
        <sourcecode type="json"><![CDATA[
{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "a": { "type": "string" }
      },
      "required": ["a"],
      "additionalProperties": true
    },
    {
      "type": "object",
      "properties": {
        "b": { "type": "number" }
      },
      "required": ["b"],
      "additionalProperties": true
    },
    {
      "type": "object",
      "properties": {
        "c": { "type": "boolean" }
      },
      "required": ["c"],
      "additionalProperties": true
    }
  ]
}
]]></sourcecode>
        <t>Here, a JSON node evaluates to <tt>true</tt> if it is an object with exactly one of the properties <tt>a</tt>, <tt>b</tt>, or <tt>c</tt>, where <tt>a</tt> is a string, <tt>b</tt> is a number, and <tt>c</tt> is a boolean:</t>
        <sourcecode type="json"><![CDATA[
{
  "a": "string"
}
]]></sourcecode>
        <t>The following JSON node evaluates to <tt>false</tt> because it matches two subschemas:</t>
        <sourcecode type="json"><![CDATA[
{
  "a": "string",
  "b": 42
}
]]></sourcecode>
      </section>
      <section anchor="not">
        <name><tt>not</tt></name>
        <t>The value of the keyword <tt>not</tt> is a single schema object, which MAY be a type union. A JSON node is valid against <tt>not</tt> if it is not valid against the schema. For example, the schema is written as follows:</t>
        <sourcecode type="json"><![CDATA[
{
  "not": { "type": "string" }
}
]]></sourcecode>
        <t>Here, a JSON node evaluates to <tt>true</tt> if it is not a string:</t>
        <sourcecode type="json"><![CDATA[
42
]]></sourcecode>
      </section>
      <section anchor="if-then-else">
        <name><tt>if</tt>/<tt>then</tt>/<tt>else</tt></name>
        <t>The values of the keywords <tt>if</tt>, <tt>then</tt>, and <tt>else</tt> are schema objects. If the processed JSON node is valid against the <tt>if</tt> schema, the <tt>then</tt> schema further constrains the JSON node and MUST match the input. If the processed JSON node is not valid against the <tt>if</tt> schema, the <tt>else</tt> schema further constrains the JSON node and MUST match the input.</t>
        <t>Consider the following schema:</t>
        <sourcecode type="json"><![CDATA[
{
  "if": {
    "properties": {
      "a": { "type": "string" }
    },
    "required": ["a"]
  },
  "then": {
    "properties": {
      "b": { "type": "number" }
    },
    "required": ["b"]
  },
  "else": {
    "properties": {
      "c": { "type": "boolean" }
    },
    "required": ["c"]
  }
}
]]></sourcecode>
        <t>Here, a JSON node evaluates to <tt>true</tt> if it is an object with a property <tt>a</tt> that is a string; then it must also have a property <tt>b</tt> that is a number:</t>
        <sourcecode type="json"><![CDATA[
{
  "a": "string",
  "b": 42
}
]]></sourcecode>
        <t>Otherwise, if the JSON node does not have a property <tt>a</tt> that is a string, it must have a property <tt>c</tt> that is a boolean:</t>
        <sourcecode type="json"><![CDATA[
{
  "c": true
}
]]></sourcecode>
        <t>or</t>
        <sourcecode type="json"><![CDATA[
{
  "a": 42,
  "c": false
}
]]></sourcecode>
      </section>
      <section anchor="enabling-the-extensions">
        <name>Enabling the Extensions</name>
        <t>The conditional composition extensions can be enabled in a schema or meta-schema
by adding the <tt>JSONSchemaConditionalComposition</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": [
    "JSONSchemaConditionalComposition"
  ],
  "oneOf" : [
    { "type": "string" },
    { "type": "number" }
  ]
}
]]></sourcecode>
        <t>Conditional composition is 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",
  "oneOf" : [
    { "type": "string" },
    { "type": "number" }
  ]
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <ul spacing="normal">
        <li>
          <t>The use of composition keywords does not alter the security model of JSON Structure Core; however, excessive nesting or overly complex compositions may impact performance and resource usage.</t>
        </li>
        <li>
          <t>Implementations MUST ensure that all subschema references resolve within the same document or trusted sources to prevent external schema injection.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document does not require any 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>
    </references>
    <?line 356?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-cond-composition-00">
      <name>Changes from draft-vasters-json-structure-cond-composition-00</name>
      <ul spacing="normal">
        <li>
          <t>No changes; date update only.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
QOo4Ev76D/a3QlKnKAAA

-->

</rfc>
