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

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

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies JSON Structure Conditional Composition, 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; rather, it is a rule set for evaluating JSON node instances against schema definitions and for laying 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="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 355?>

<section numbered="false" anchor="changes-from-draft-vasters-json-structure-cond-composition-01">
      <name>Changes from draft-vasters-json-structure-cond-composition-01</name>
      <ul spacing="normal">
        <li>
          <t>Aligned introduction terminology with document title ("Conditional
Composition" instead of "Conditionals").</t>
        </li>
        <li>
          <t>Improved awkward sentence structure in the introduction.</t>
        </li>
        <li>
          <t>Removed unused/obsolete RFC 4646 from normative references.</t>
        </li>
      </ul>
    </section>
    <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:
H4sIAAAAAAAAA+1a3W4buRW+n6cg5AXaApKdpOm2VVCgTuJ0vU3i1Fa6KIoF
RM1Q0sSjoTrkWFENL/oQfcI+Sb9zSM5wrHFsZ930Jr6Q54c8/+c7h+SMRqMk
sbkt1FgMvj87eSvObFWntq7w4IUus9zmupQFrldrbfhukKTSqoWutmNhbJYk
mU5LucKErJJzO7qQxqrKjD4YXY5MIDdKQQ0/DZnRoyeJqWer3Bjc2e0aBI6P
Jq+E2BOyMBoC5WWm1go/pR0MxUBBGl3lsqCb48Pn+KcrXJ1OXg2Ssl7NVDVO
Msg2Fk8ePfnN6PGT0aOnCfgaVZrajAVkUcnFWPw6kZWSY/GDmglZZuK4hMCl
smJSydKsdWWTja7OF5Wu12PxvM6LLC8X4nmh03Mj5mD63WTyThy+OzbJudpi
bDZuiIxekhWSC1XWapwI4alMnr/EjVPzBxAngn+iV3i6knkRRsgqXYbrRW6X
9QyG6JryIG0dE1t0gCkF1DcWU5bWrs344KA7dd+R3M/1TUQO7uXE/aVdFYMk
kbVdalhfjCCDEPO6KFxIvCjUCtYXf3X0+K2uFrLM/ymJwFi8ydNKGz23iLEK
tufHPE45u6SOxMUfV2HkPiRIklJXKwy+YCufvnrx5PHj3/vL3z3+7VO6/P5s
cvr+xWT04uT0aMw0+2OdWKsBD2g04b/RLapYWS0UzH0Ha8Nvt5gWE8icSZKX
81a3JBmNRkLOMFKmFreTZW4Ecq6GNFaYtUrzea6M2FGpN3uHiHihPlpogjth
ddJjCmGX0oq8tJXO6hS0I5cLSige7VIBr2Z5SeG8qgubrwuVmHQJ34lMzfGC
5ph9pIdYy8rmaV3IaggGUMLLnrLL3XDwskslDOaXGGyGidmWVn4ccqI61hKC
Od401CegEVNZFCfz6RAX5dZd6FLxBc2dltpOh4k0YqOKQkjHaJrPpwdTXJX4
pwqjpiJKjFbXfe+HVZ5l0DDZo3xn67Dsl3t5dHv14E7anYefy8s4vq+uerwW
a3IPD4qH9KB4WA+Kz/fgnpioapWXutCLLZOE/QHUrCB8aNu3I8lA17xll7Ko
wsn65v3ZZMi/4u0Jrs6+O3z92v9zT06P/vL++PToJT08ef/6pVPi5N3k+OTt
4WsAvSLHzhR5TFXrSlmVkVKZMmmVz3CTI7AuPbLBvTSd7wnerq6g0PuyUMYI
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
DUBqQfYz/XQmJy9P4PQwEuH+Xzujroj3KQAA

-->

</rfc>
