<?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.6.39 (Ruby 3.2.2) -->
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-jsonpath-base-20" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocDepth="4" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title abbrev="JSONPath">JSONPath: Query expressions for JSON</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-20"/>
    <author initials="S." surname="Gössner" fullname="Stefan Gössner" role="editor">
      <organization>Fachhochschule Dortmund</organization>
      <address>
        <postal>
          <street>Sonnenstraße 96</street>
          <city>Dortmund</city>
          <code>D-44139</code>
          <country>Germany</country>
        </postal>
        <email>stefan.goessner@fh-dortmund.de</email>
      </address>
    </author>
    <author initials="G." surname="Normington" fullname="Glyn Normington" role="editor">
      <organization/>
      <address>
        <postal>
          <street/>
          <city>Winchester</city>
          <region/>
          <code/>
          <country>UK</country>
        </postal>
        <phone/>
        <email>glyn.normington@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2023"/>
    <area>ART</area>
    <workgroup>JSONPath WG</workgroup>
    <keyword>JSON</keyword>
    <abstract>
      <?line 145?>

<t>JSONPath defines a string syntax for selecting and extracting JSON (RFC 8259) values
from a JSON value.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-jsonpath-base/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        JSON Path Working Group mailing list (<eref target="mailto:jsonpath@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/jsonpath/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/jsonpath/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-jsonpath/draft-ietf-jsonpath-base"/>.</t>
    </note>
  </front>
  <middle>
    <?line 150?>

<!-- define an ALD to simplify below -->
<!-- use as {: unnumbered} -->

<!-- editorial issue: lots of complicated nesting of quotes, as in -->
<!-- `"13 == '13'"` or `$`.  We probably should find a simpler style -->

<section anchor="introduction">
      <name>Introduction</name>
      <t>JSON <xref target="RFC8259"/> is a popular representation
format for structured data values.
JSONPath defines a string syntax for selecting and extracting JSON values
from a JSON value.</t>
      <t>JSONPath is not intended as a replacement for, but as a more powerful
companion to, JSON Pointer <xref target="RFC6901"/>. See <xref target="json-pointer"/>.</t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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.</t>
        <?line -18?>

<t>The grammatical rules in this document are to be interpreted as ABNF,
as described in <xref target="RFC5234"/>.
ABNF terminal values in this document define Unicode code points rather than
their UTF-8 encoding.
For example, the Unicode PLACE OF INTEREST SIGN (U+2318) would be defined
in ABNF as <tt>%x2318</tt>.</t>
        <t>Functions are referred to using the function name followed by a pair
of parentheses, as in <tt>fname()</tt>.</t>
        <t>The terminology of <xref target="RFC8259"/> applies except where clarified below.
The terms "Primitive" and "Structured" are used to group
different kinds of values as in <xref section="1" sectionFormat="of" target="RFC8259"/>; JSON Objects and Arrays are
structured, all other values are primitive.
Definitions for "Object", "Array", "Number", and "String" remain
unchanged.
Importantly "object" and "array" in particular do not take on a
generic meaning, such as they would in a general programming context.</t>
        <t>Additional terms used in this document are defined below.</t>
        <dl>
          <dt>Value:</dt>
          <dd>
            <t>As per <xref target="RFC8259"/>, a structure conforming to the generic data model of JSON, i.e.,
composed of constituents such as structured values, namely JSON objects and arrays, and
primitive data, namely numbers and text strings as well as the special
values null, true, and false.
<xref target="RFC8259"/> focuses on the textual representation of JSON values and
does not fully define the value abstraction assumed here.</t>
          </dd>
          <dt>Member:</dt>
          <dd>
            <t>A name/value pair in an object.  (A member is not itself a value.)</t>
          </dd>
          <dt>Name:</dt>
          <dd>
            <t>The name (a string) in a name/value pair constituting a member.
This is also used in <xref target="RFC8259"/>, but that specification does not
formally define it.
It is included here for completeness.</t>
          </dd>
          <dt>Element:</dt>
          <dd>
            <t>A value in a JSON array.</t>
          </dd>
          <dt>Index:</dt>
          <dd>
            <t>An integer that identifies a specific element in an array.</t>
          </dd>
          <dt>Query:</dt>
          <dd>
            <t>Short name for a JSONPath expression.</t>
          </dd>
          <dt>Query Argument:</dt>
          <dd>
            <t>Short name for the value a JSONPath expression is applied to.
(Also used for actual parameters of function-expressions.)</t>
          </dd>
          <dt>Location:</dt>
          <dd>
            <t>the position of a value within the query argument. This can be thought of
as a sequence of names and indexes navigating to the value through
the objects and arrays in the query argument, with the empty sequence
indicating the query argument itself.
A location can be represented as a Normalized Path (defined below).</t>
          </dd>
          <dt>Node:</dt>
          <dd>
            <t>The pair of a value along with its location within the query argument.</t>
          </dd>
          <dt>Root Node:</dt>
          <dd>
            <t>The unique node whose value is the entire query argument.</t>
          </dd>
          <dt>Root Node Identifier:</dt>
          <dd>
            <t>The expression <tt>$</tt> which refers to the root node of the query argument.</t>
          </dd>
          <dt>Current Node Identifier:</dt>
          <dd>
            <t>The expression <tt>@</tt> which refers to the current node in the context
of the evaluation of a filter expression (described later).</t>
          </dd>
          <dt>Children (of a node):</dt>
          <dd>
            <t>If the node is an array, the nodes of its elements.
If the node is an object, the nodes of its member values.
If the node is neither an array nor an object, it has no children.</t>
          </dd>
          <dt>Descendants (of a node):</dt>
          <dd>
            <t>The children of the node, together with the children of its children, and so forth
recursively. More formally, the "descendants" relation between nodes is the transitive
closure of the "children" relation.</t>
          </dd>
          <dt>Depth (of a descendant node within a value):</dt>
          <dd>
            <t>The number of ancestors of the node within the value. The root node of the value has depth zero,
the children of the root node have depth one, their children have depth two, and so forth.</t>
          </dd>
          <dt>Nodelist:</dt>
          <dd>
            <t>A list of nodes.
While a nodelist can be represented in JSON, e.g. as an array, this document
does not require or assume any particular representation.</t>
          </dd>
          <dt>Parameter:</dt>
          <dd>
            <t>Formal parameter (of a function) that can take a function argument
(an actual parameter) in a function-expression.</t>
          </dd>
          <dt>Normalized Path:</dt>
          <dd>
            <t>A form of JSONPath expression that identifies a node in a value by
providing a query that results in exactly that node.  Each node in a
query argument is identified by exactly one Normalized Path (we say, the
Normalized Path is "unique" for that node), and, to be a Normalized
Path for a specific query argument, the Normalized Path needs to identify
exactly one node. Similar
to, but syntactically different from, a JSON Pointer <xref target="RFC6901"/>.
Note: This definition is based on the syntactical definition in <xref target="normalized-paths"/>;
JSONPath expressions that identify a node in a value but do not conform to that
syntax are not Normalized Paths.</t>
          </dd>
          <dt>Unicode Scalar Value:</dt>
          <dd>
            <t>Any Unicode <xref target="UNICODE"/> code point except high-surrogate and low-surrogate code points.
In other words, integers in either of the inclusive base 16 ranges 0 to D7FF and
E000 to 10FFFF. JSONPath queries are sequences of Unicode scalar values.</t>
          </dd>
          <dt>Segment:</dt>
          <dd>
            <t>One of the constructs which select children (<tt>[&lt;selectors&gt;]</tt>)
or descendants (<tt>..[&lt;selectors&gt;]</tt>) of an input value.</t>
          </dd>
          <dt>Selector:</dt>
          <dd>
            <t>A single item within a segment that takes the input value and produces a nodelist
consisting of child nodes of the input value.</t>
          </dd>
          <dt>Singular Query:</dt>
          <dd>
            <t>A JSONPath expression built from segments that have been syntactically restricted in
a certain way (<xref target="filter-selector-syntax"/>) so that, regardless of the input
value, the expression produces a nodelist containing at most one node.
Note: JSONPath expressions that always produce a singular nodelist but do not
conform to the syntax in <xref target="filter-selector-syntax"/> are not Singular Queries.</t>
          </dd>
        </dl>
        <section anchor="json-values-as-trees-of-nodes">
          <name>JSON Values as Trees of Nodes</name>
          <t>This document models the query argument as a tree of JSON values, each
with its own node.
A node is either the root node or one of its descendants.</t>
          <t>This document models the result of applying a query to the
query argument as a nodelist (a list of nodes).</t>
          <t>Nodes are the selectable parts of the query argument.
The only parts of an object that can be selected by a query are the
member values. Member names and members (name/value pairs) cannot be
selected.
Thus, member values have nodes, but members and member names do not.
Similarly, member values are children of an object, but members and
member names are not.</t>
        </section>
      </section>
      <section anchor="history">
        <name>History</name>
        <t>This document is based on <contact fullname="Stefan Gössner"/>'s popular JSONPath proposal
dated 2007-02-21 <xref target="JSONPath-orig"/>, builds on the experience from the widespread
deployment of its implementations, and provides a normative specification for it.</t>
        <t><xref target="inspired-by-xpath"/> describes how JSONPath was inspired by XML's XPath
<xref target="XPath"/>.</t>
        <t>JSONPath was intended as a light-weight companion to JSON
implementations in programming languages such as PHP and JavaScript,
so instead of defining its own expression language, like XPath did,
JSONPath delegated parts of a query to the underlying
runtime, e.g., JavaScript's <tt>eval()</tt> function.
As JSONPath was implemented in more environments, JSONPath
expressions became decreasingly portable.
For example, regular expression processing was often delegated to a
convenient regular expression engine.</t>
        <t>This document aims to remove such implementation-specific dependencies and
serve as a common JSONPath specification that can be used across
programming languages and environments.
This means that backwards compatibility is
not always achieved; a design principle of this document is to
go with a "consensus" between implementations even if it is rough, as
long as that does not jeopardize the objective of obtaining a usable,
stable JSON query language.</t>
        <t>The term <em>JSONPath</em> was chosen because of the XPath inspiration and also because
the outcome of a query consists of <em>paths</em> identifying nodes in the
JSON query argument.</t>
      </section>
      <section anchor="json-values">
        <name>JSON Values</name>
        <t>The JSON value a JSONPath query is applied to is, by definition, a
valid JSON value. A JSON value is often constructed by parsing
a JSON text.</t>
        <t>The parsing of a JSON text into a JSON value and what happens if a JSON
text does not represent valid JSON are not defined by this document.
Sections <xref target="RFC8259" section="4" sectionFormat="bare"/> and <xref target="RFC8259" section="8" sectionFormat="bare"/> of <xref target="RFC8259"/> identify specific situations that may
conform to the grammar for JSON texts but are not interoperable uses
of JSON, as they may cause unpredictable behavior.
This document does not attempt to define predictable
behavior for JSONPath queries in these situations.</t>
        <t>Specifically, the "Semantics" subsections of Sections
<xref format="counter" target="name-selector"/>, <xref format="counter" target="wildcard-selector"/>,
<xref format="counter" target="filter-selector"/>, and <xref format="counter" target="descendant-segment"/> describe behavior that
becomes unpredictable when the JSON value for one of the objects
under consideration was constructed out of JSON text that exhibits
multiple members for a single object that share the same member name
("duplicate names", see <xref section="4" sectionFormat="of" target="RFC8259"/>).
Also, selecting a child by name (<xref target="name-selector"/>) and comparing strings
(<xref target="comparisons"/> in <xref target="filter-selector"/>) assume these
strings are sequences of Unicode scalar values, becoming unpredictable
if they are not (<xref section="8.2" sectionFormat="of" target="RFC8259"/>).</t>
      </section>
      <section anchor="overview">
        <name>Overview of JSONPath Expressions</name>
        <t>A JSONPath expression is applied to a JSON value, known as the query argument.
The output is a nodelist.</t>
        <t>A JSONPath expression consists of an identifier followed by a series
of zero or more segments each of which contains one or more selectors.</t>
        <section anchor="ids">
          <name>Identifiers</name>
          <t>The root node identifier <tt>$</tt> refers to the root node of the query argument,
i.e., to the argument as a whole.</t>
          <t>The current node identifier <tt>@</tt> refers to the current node in the context
of the evaluation of a filter expression (<xref target="filter-selector"/>).</t>
        </section>
        <section anchor="segments">
          <name>Segments</name>
          <t>Segments select children (<tt>[&lt;selectors&gt;]</tt>) or descendants (<tt>..[&lt;selectors&gt;]</tt>) of an input value.</t>
          <t>Segments can use <em>bracket notation</em>, for example:</t>
          <sourcecode type="JSONPath"><![CDATA[
$['store']['book'][0]['title']
]]></sourcecode>
          <t>or the more compact <em>dot notation</em>, for example:</t>
          <sourcecode type="JSONPath"><![CDATA[
$.store.book[0].title
]]></sourcecode>
          <t>Bracket notation contains a comma separated list of one or more selectors of any kind.
Selectors are detailed in the next section.</t>
          <t>A JSONPath expression may use a combination of bracket and dot notations.</t>
          <t>This document treats the bracket notations as canonical and defines the shorthand dot notation in terms
of bracket notation. Examples and descriptions use shorthands where convenient.</t>
        </section>
        <section anchor="selectors">
          <name>Selectors</name>
          <t>A name selector, e.g. <tt>'name'</tt>, selects a named child of an object.</t>
          <t>An index selector, e.g. <tt>3</tt>, selects an indexed child of an array.</t>
          <t>A wildcard <tt>*</tt> (<xref target="wildcard-selector"/>) in the expression <tt>[*]</tt> selects all children of a
node and in the expression <tt>..[*]</tt> selects all descendants of a node.</t>
          <t>An array slice <tt>start:end:step</tt> (<xref target="slice"/>) selects a series of
elements from an array, giving a start position, an end position, and
an optional step value that moves the position from the start to the
end.</t>
          <t>Filter expressions <tt>?&lt;logical-expr&gt;</tt> select certain children of an object or array, as in:</t>
          <sourcecode type="JSONPath"><![CDATA[
$.store.book[?@.price < 10].title
]]></sourcecode>
        </section>
        <section anchor="summary">
          <name>Summary</name>
          <t><xref target="tbl-overview"/> provides a brief overview of JSONPath syntax.</t>
          <table anchor="tbl-overview">
            <name>Overview of JSONPath syntax</name>
            <thead>
              <tr>
                <th align="left">Syntax Element</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>$</tt></td>
                <td align="left">
                  <xref target="root-identifier">root node identifier</xref></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>@</tt></td>
                <td align="left">
                  <xref target="filter-selector">current node identifier</xref> (valid only within filter selectors)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>[&lt;selectors&gt;]</tt></td>
                <td align="left">
                  <xref target="child-segment">child segment</xref> selects zero or more children of a node; contains one or more selectors, separated by commas</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>.name</tt></td>
                <td align="left">shorthand for <tt>['name']</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>.*</tt></td>
                <td align="left">shorthand for <tt>[*]</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>..[&lt;selectors&gt;]</tt></td>
                <td align="left">
                  <xref target="descendant-segment">descendant segment</xref>: selects zero or more descendants of a node; contains one or more selectors, separated by commas</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>..name</tt></td>
                <td align="left">shorthand for <tt>..['name']</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>..*</tt></td>
                <td align="left">shorthand for <tt>..[*]</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>'name'</tt></td>
                <td align="left">
                  <xref target="name-selector">name selector</xref>: selects a named child of an object</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>*</tt></td>
                <td align="left">
                  <xref target="name-selector">wildcard selector</xref>: selects all children of a node</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>3</tt></td>
                <td align="left">
                  <xref target="index-selector">index selector</xref>: selects an indexed child of an array (from 0)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>0:100:5</tt></td>
                <td align="left">
                  <xref target="slice">array slice selector</xref>: start:end:step for arrays</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>?&lt;logical-expr&gt;</tt></td>
                <td align="left">
                  <xref target="filter-selector">filter selector</xref>: selects particular children using a logical expression</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>length(@.foo)</tt></td>
                <td align="left">
                  <xref target="fnex">function extension</xref>: invokes a function in a filter expression</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="jsonpath-examples">
        <name>JSONPath Examples</name>
        <t>This section is informative. It provides examples of JSONPath expressions.</t>
        <t>The examples are based on the simple JSON value shown in
<xref target="fig-example-value"/>, representing a bookstore (that also has a bicycle).</t>
        <figure anchor="fig-example-value">
          <name>Example JSON value</name>
          <sourcecode type="json"><![CDATA[
{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 399
    }
  }
}
]]></sourcecode>
        </figure>
        <t><xref target="tbl-example"/> shows some JSONPath queries that might be applied to this example and their intended results.</t>
        <table anchor="tbl-example">
          <name>Example JSONPath expressions and their intended results when applied to the example JSON value</name>
          <thead>
            <tr>
              <th align="left">JSONPath</th>
              <th align="left">Intended result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>$.store.book[*].author</tt></td>
              <td align="left">the authors of all books in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..author</tt></td>
              <td align="left">all authors</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$.store.*</tt></td>
              <td align="left">all things in store, which are some books and a red bicycle</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$.store..price</tt></td>
              <td align="left">the prices of everything in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[2]</tt></td>
              <td align="left">the third book</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[2].author</tt></td>
              <td align="left">the third book's author</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[2].publisher</tt></td>
              <td align="left">empty result: the third book does not have a "publisher" member</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[-1]</tt></td>
              <td align="left">the last book in order</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[0,1]</tt><br/><tt>$..book[:2]</tt></td>
              <td align="left">the first two books</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[?@.isbn]</tt></td>
              <td align="left">all books with an ISBN number</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..book[?@.price&lt;10]</tt></td>
              <td align="left">all books cheaper than 10</td>
            </tr>
            <tr>
              <td align="left">
                <tt>$..*</tt></td>
              <td align="left">all member values and array elements contained in the input value</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="jsonpath-syntax-and-semantics">
      <name>JSONPath Syntax and Semantics</name>
      <section anchor="synsem-overview">
        <name>Overview</name>
        <t>A JSONPath <em>expression</em> is a string which, when applied to a JSON value,
the <em>query argument</em>, selects zero or more nodes of the argument and outputs
these nodes as a nodelist.</t>
        <t>A query <bcp14>MUST</bcp14> be encoded using UTF-8.
The grammar for queries given in this document assumes that its UTF-8 form is first decoded into
Unicode code points as described
in <xref target="RFC3629"/>; implementation approaches that lead to an equivalent
result are possible.</t>
        <t>A string to be used as a JSONPath query needs to be <em>well-formed</em> and
<em>valid</em>.
A string is a well-formed JSONPath query if it conforms to the ABNF syntax in this document.
A well-formed JSONPath query is valid if it also fulfills all semantic
requirements posed by this document, which are:</t>
        <ol spacing="normal" type="1"><li>Integer numbers in the JSONPath query that are relevant
to the JSONPath processing (e.g., index values and steps) <bcp14>MUST</bcp14> be
within the range of exact values defined in I-JSON <xref target="RFC7493"/>, namely
within the interval [-(2<sup>53</sup>)+1, (2<sup>53</sup>)-1].</li>
          <li>Uses of function extensions <bcp14>MUST</bcp14> be <em>well-typed</em>,
as described in <xref target="fnex"/>.</li>
        </ol>
        <t>A JSONPath implementation <bcp14>MUST</bcp14> raise an error for any query which is not
well-formed and valid.
The well-formedness and the validity of JSONPath queries are independent of
the JSON value the query is applied to. No further errors relating to the
well-formedness and the validity of a JSONPath query can be
raised during application of the query to a value.
This clearly separates well-formedness/validity errors in the query
from mismatches that may actually stem from flaws in the data.</t>
        <t>Mismatches between the structure expected by a valid query
and the structure found in the data can lead to empty query results,
which may be unexpected and indicate bugs in either.
JSONPath implementations might therefore want to provide diagnostics
to the application developer that aid in finding the cause of empty
results.</t>
        <t>Obviously, an implementation can still fail when executing a JSONPath
query, e.g., because of resource depletion, but this is not modeled in
this document.  However, the implementation <bcp14>MUST NOT</bcp14>
silently malfunction.  Specifically, if a valid JSONPath query is
evaluated against a structured value whose size is too large to
process the query correctly (for instance requiring the processing of
numbers that fall outside the range of exact values), the implementation
<bcp14>MUST</bcp14> provide an indication of overflow.</t>
        <t>(Readers familiar with the HTTP error model may be reminded of 400
type errors when pondering well-formedness and validity, while
resource depletion and related errors are comparable to 500 type
errors.)</t>
        <section anchor="syntax">
          <name>Syntax</name>
          <t>Syntactically, a JSONPath query consists of a root identifier (<tt>$</tt>), which
stands for a nodelist that contains the root node of the query argument,
followed by a possibly empty sequence of <em>segments</em>.</t>
          <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
jsonpath-query      = root-identifier segments
segments            = *(S segment)

B                   = %x20 /    ; Space
                      %x09 /    ; Horizontal tab
                      %x0A /    ; Line feed or New line
                      %x0D      ; Carriage return
S                   = *B        ; optional blank space
]]></sourcecode>
          <t>The syntax and semantics of segments are defined in <xref target="segments-details"/>.</t>
        </section>
        <section anchor="semantics">
          <name>Semantics</name>
          <t>In this document, the semantics of a JSONPath query define the
required results and do not prescribe the internal workings of an
implementation.  This document may describe semantics in a procedural
step-by-step fashion, but such descriptions are normative only in the sense that any implementation <bcp14>MUST</bcp14> produce an identical result, but not in the sense that implementors are required to use the same algorithms.</t>
          <t>The semantics are that a valid query is executed against a value,
the <em>query argument</em>, and produces a nodelist (i.e., a list of zero or more nodes of the value).</t>
          <t>The query is a root identifier followed by a sequence of zero or more segments, each of
which is applied to the result of the previous root identifier or segment and provides
input to the next segment.
These results and inputs take the form of nodelists.</t>
          <t>The nodelist resulting from the root identifier contains a single node,
the query argument.
The nodelist resulting from the last segment is presented as the
result of the query. Depending on the specific API, it might be
presented as an array of the JSON values at the nodes, an array of
Normalized Paths referencing the nodes, or both — or some other
representation as desired by the implementation.
Note: an empty nodelist is a valid query result.</t>
          <t>A segment operates on each of the nodes in its input nodelist in turn,
and the resultant nodelists are concatenated in the order of the input
nodelist they were derived from to produce
the result of the segment. A node may be selected more than once and
appears that number of times in the nodelist. Duplicate nodes are not removed.</t>
          <t>A syntactically valid segment <bcp14>MUST NOT</bcp14> produce errors when executing the query.
This means that some
operations that might be considered erroneous, such as using an index
lying outside the range of an array,
simply result in fewer nodes being selected.
(Additional discussion of this property can be found in the
introduction to <xref target="synsem-overview"/>.)</t>
          <t>As a consequence of this approach, if any of the segments produces an empty nodelist,
then the whole query produces an empty nodelist.</t>
          <t>If a query may produce a nodelist with more than one possible ordering, a particular implementation
may also produce distinct orderings in successive runs of the query.</t>
        </section>
        <section anchor="example">
          <name>Example</name>
          <t>Consider this example. With the query argument <tt>{"a":[{"b":0},{"b":1},{"c":2}]}</tt>, the
query <tt>$.a[*].b</tt> selects the following list of nodes: <tt>0</tt>, <tt>1</tt>
(denoted here by their value).</t>
          <t>The query consists of <tt>$</tt> followed by three segments: <tt>.a</tt>, <tt>[*]</tt>, and <tt>.b</tt>.</t>
          <t>Firstly, <tt>$</tt> produces a nodelist consisting of just the query argument.</t>
          <t>Next, <tt>.a</tt> selects from any object input node and selects the
node of any
member value of the input
node corresponding to the member name <tt>"a"</tt>.
The result is again a list of one node: <tt>[{"b":0},{"b":1},{"c":2}]</tt>.</t>
          <t>Next, <tt>[*]</tt> selects from any array input node all its elements
(for an object input node, it would select all its member
values, but not the member names).
The result is a list of three nodes: <tt>{"b":0}</tt>, <tt>{"b":1}</tt>, and <tt>{"c":2}</tt>.</t>
          <t>Finally, <tt>.b</tt> selects from any object input node with a member name
<tt>b</tt> and selects the node of the member value of the input node corresponding to that name.
The result is a list containing <tt>0</tt>, <tt>1</tt>.
This is the concatenation of three lists, two of length one containing
<tt>0</tt>, <tt>1</tt>, respectively, and one of length zero.</t>
        </section>
      </section>
      <section anchor="root-identifier">
        <name>Root Identifier</name>
        <section anchor="syntax-1">
          <name>Syntax</name>
          <t>Every JSONPath query (except those inside filter expressions, see <xref target="filter-selector"/>) <bcp14>MUST</bcp14> begin with the root identifier <tt>$</tt>.</t>
          <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
root-identifier     = "$"
]]></sourcecode>
        </section>
        <section anchor="semantics-1">
          <name>Semantics</name>
          <t>The root identifier <tt>$</tt> represents the root node of the query argument
and produces a nodelist consisting of that root node.</t>
        </section>
        <section anchor="examples">
          <name>Examples</name>
          <aside>
            <t>In this and the following examples in Sections <xref format="counter" target="root-identifier"/> and
<xref format="counter" target="selector-details"/> except for <xref target="tbl-comparison"/>, we will present a
JSON text to show the JSON value used as the query argument to the
queries in the examples, and then a table with the columns:</t>
            <ul spacing="normal">
              <li>Query: an example query to be applied to the query argument</li>
              <li>Result: the query result as a list of JSON values that were located in the query argument</li>
              <li>Result Path: the query result as a list of (normalized) paths into
the query argument, giving locations of the JSON values in the previous column</li>
              <li>Comment: descriptive information</li>
            </ul>
          </aside>
          <t>JSON:</t>
          <sourcecode type="json"><![CDATA[
{"k": "v"}
]]></sourcecode>
          <t>Queries:</t>
          <table anchor="tbl-root">
            <name>Root identifier examples</name>
            <thead>
              <tr>
                <th align="center">Query</th>
                <th align="left">Result</th>
                <th align="center">Result Path</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$</tt></td>
                <td align="left">
                  <tt>{"k": "v"}</tt></td>
                <td align="center">
                  <tt>$</tt></td>
                <td align="left">Root node</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="selector-details">
        <name>Selectors</name>
        <t>Selectors appear only inside <xref target="child-segment">child segments</xref> and
<xref target="descendant-segment">descendant segments</xref>.</t>
        <t>A selector produces a nodelist consisting of zero or more children of the input value.</t>
        <t>There are various kinds of selectors which produce children of objects, children of arrays,
or children of either objects or arrays.</t>
        <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
selector            = name-selector  /
                      wildcard-selector /
                      slice-selector /
                      index-selector /
                      filter-selector
]]></sourcecode>
        <t>The syntax and semantics of each kind of selector are defined below.</t>
        <section anchor="name-selector">
          <name>Name Selector</name>
          <section anchor="syntax-name">
            <name>Syntax</name>
            <t>A name selector <tt>'&lt;name&gt;'</tt> selects at most one object member value.</t>
            <t>In contrast to JSON,
the JSONPath syntax allows strings to be enclosed in <em>single</em> or <em>double</em> quotes.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
name-selector       = string-literal

string-literal      = %x22 *double-quoted %x22 /     ; "string"
                      %x27 *single-quoted %x27       ; 'string'

double-quoted       = unescaped /
                      %x27      /                    ; '
                      ESC %x22  /                    ; \"
                      ESC escapable

single-quoted       = unescaped /
                      %x22      /                    ; "
                      ESC %x27  /                    ; \'
                      ESC escapable

ESC                 = %x5C                           ; \  backslash

unescaped           = %x20-21 /                      ; see RFC 8259
                         ; omit 0x22 "
                      %x23-26 /
                         ; omit 0x27 '
                      %x28-5B /
                         ; omit 0x5C \
                      %x5D-10FFFF

escapable           = %x62 / ; b BS backspace U+0008
                      %x66 / ; f FF form feed U+000C
                      %x6E / ; n LF line feed U+000A
                      %x72 / ; r CR carriage return U+000D
                      %x74 / ; t HT horizontal tab U+0009
                      "/"  / ; / slash (solidus) U+002F
                      "\"  / ; \ backslash (reverse solidus) U+005C
                      (%x75 hexchar) ;  uXXXX      U+XXXX

hexchar             = non-surrogate /
                      (high-surrogate "\" %x75 low-surrogate)
non-surrogate       = ((DIGIT / "A"/"B"/"C" / "E"/"F") 3HEXDIG) /
                       ("D" %x30-37 2HEXDIG )
high-surrogate      = "D" ("8"/"9"/"A"/"B") 2HEXDIG
low-surrogate       = "D" ("C"/"D"/"E"/"F") 2HEXDIG

HEXDIG              = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
]]></sourcecode>
            <t>Notes:</t>
            <ul spacing="normal">
              <li>
                <tt>double-quoted</tt> strings follow the JSON string syntax (<xref section="7" sectionFormat="of" target="RFC8259"/>);
<tt>single-quoted</tt> strings follow an analogous pattern (<xref target="syntax-index"/>).
No attempt was made to improve on this syntax, so if it is desired to
escape characters with
scalar values above 0xFFFF, such as <u format="num-lit-name">🤔</u>,
they need to be represented
by a pair of surrogate escapes (<tt>"\uD83E\uDD14"</tt> in this case).</li>
              <li>Alphabetic characters in ABNF quoted strings are case-insensitive,
so each of the hexadecimal digits within <tt>\u</tt> escapes (as specified in rules
referenced by <tt>hexchar</tt>) can be either lower case or upper case,
while the <tt>u</tt> in <tt>\u</tt> needs to be lower case (indicated as <tt>%x75</tt>).</li>
            </ul>
          </section>
          <section anchor="semantics-2">
            <name>Semantics</name>
            <t>A <tt>name-selector</tt> string <bcp14>MUST</bcp14> be converted to a
member name <tt>M</tt> by removing the surrounding quotes and
replacing each escape sequence with its equivalent Unicode character, as
shown in <xref target="tbl-esc"/>:</t>
            <table anchor="tbl-esc">
              <name>Escape Sequence Replacements</name>
              <thead>
                <tr>
                  <th align="center">Escape Sequence</th>
                  <th align="center">Unicode Character</th>
                  <th align="left">Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>\b</tt></td>
                  <td align="center">U+0008</td>
                  <td align="left">BS backspace</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\t</tt></td>
                  <td align="center">U+0009</td>
                  <td align="left">HT horizontal tab</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\n</tt></td>
                  <td align="center">U+000A</td>
                  <td align="left">LF line feed</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\f</tt></td>
                  <td align="center">U+000C</td>
                  <td align="left">FF form feed</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\r</tt></td>
                  <td align="center">U+000D</td>
                  <td align="left">CR carriage return</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\"</tt></td>
                  <td align="center">U+0022</td>
                  <td align="left">quotation mark</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\'</tt></td>
                  <td align="center">U+0027</td>
                  <td align="left">apostrophe</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\/</tt></td>
                  <td align="center">U+002F</td>
                  <td align="left">slash (solidus)</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\\</tt></td>
                  <td align="center">U+005C</td>
                  <td align="left">backslash (reverse solidus)</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>\uXXXX</tt></td>
                  <td align="center">U+XXXX</td>
                  <td align="left">unicode character</td>
                </tr>
              </tbody>
            </table>
            <t>Applying the <tt>name-selector</tt> to an object node
selects a member value whose name equals the member name <tt>M</tt>,
or selects nothing if there is no such member value.
Nothing is selected from a value that is not an object.</t>
            <t>Note: processing the name selector requires comparing the member name string <tt>M</tt>
with member name strings in the JSON to which the selector is being applied.
Two strings <bcp14>MUST</bcp14> be considered equal if and only if they are identical
sequences of Unicode scalar values. In other words, normalization operations
<bcp14>MUST NOT</bcp14> be applied to either the member name string <tt>M</tt> from the JSONPath or to
the member name strings in the JSON prior to comparison.</t>
          </section>
          <section anchor="examples-1">
            <name>Examples</name>
            <!-- EDITING NOTE: there are non-breaking spaces here between j and j -->
<!-- i.e., j j and not j j -->

<t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "o": {"j j": {"k.k": 3}},
  "'": {"@": 2}
}
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-name"/> show the name selector in use by child segments:</t>
            <table anchor="tbl-name">
              <name>Name selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$.o['j j']</tt></td>
                  <td align="left">
                    <tt>{"k.k": 3}</tt></td>
                  <td align="center">
                    <tt>$['o']['j j']</tt></td>
                  <td align="left">Named value in nested object</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o['j j']['k.k']</tt></td>
                  <td align="left">
                    <tt>3</tt></td>
                  <td align="center">
                    <tt>$['o']['j j']['k.k']</tt></td>
                  <td align="left">Nesting further down</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o["j j"]["k.k"]</tt></td>
                  <td align="left">
                    <tt>3</tt></td>
                  <td align="center">
                    <tt>$['o']['j j']['k.k']</tt></td>
                  <td align="left">Different delimiter in query, unchanged normalized path</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$["'"]["@"]</tt></td>
                  <td align="left">
                    <tt>2</tt></td>
                  <td align="center">
                    <tt>$['\'']['@']</tt></td>
                  <td align="left">Unusual member names</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="wildcard-selector">
          <name>Wildcard Selector</name>
          <section anchor="syntax-2">
            <name>Syntax</name>
            <t>The wildcard selector consists of an asterisk.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
wildcard-selector   = "*"
]]></sourcecode>
          </section>
          <section anchor="semantics-3">
            <name>Semantics</name>
            <t>A wildcard selector selects the nodes of all children of an object or array.
The order in which the children of an object appear in the resultant nodelist is not stipulated,
since JSON objects are unordered.
Children of an array appear in array order in the resultant nodelist.</t>
            <t>The wildcard selector selects nothing from a primitive JSON value (that is,
a number, a string, <tt>true</tt>, <tt>false</tt>, or <tt>null</tt>).</t>
          </section>
          <section anchor="examples-2">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3]
}
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-wild"/> show the wildcard selector in use by a child segment:</t>
            <table anchor="tbl-wild">
              <name>Wildcard selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[*]</tt></td>
                  <td align="left">
                    <tt>{"j": 1, "k": 2}</tt> <br/> <tt>[5, 3]</tt></td>
                  <td align="center">
                    <tt>$['o']</tt> <br/> <tt>$['a']</tt></td>
                  <td align="left">Object values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[*]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt></td>
                  <td align="left">Object values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[*]</tt></td>
                  <td align="left">
                    <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['k']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Alternative result</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[*, *]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Non-deterministic ordering</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[*]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>3</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt></td>
                  <td align="left">Array members</td>
                </tr>
              </tbody>
            </table>
            <t>The example above with the query <tt>$.o[*, *]</tt> shows that the wildcard selector may produce nodelists in distinct
orders each time it appears in the child segment, when it is applied to an object node with two or more
members (but not when it is applied to object nodes with fewer than two members or to array nodes).</t>
          </section>
        </section>
        <section anchor="index-selector">
          <name>Index Selector</name>
          <section anchor="syntax-index">
            <name>Syntax</name>
            <t>An index selector <tt>&lt;index&gt;</tt> matches at most one array element value.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
index-selector      = int                        ; decimal integer

int                 = "0" /
                      (["-"] DIGIT1 *DIGIT)      ; - optional
DIGIT1              = %x31-39                    ; 1-9 non-zero digit
]]></sourcecode>
            <t>Applying the numerical <tt>index-selector</tt> selects the corresponding
element. JSONPath allows it to be negative (see <xref target="index-semantics"/>).</t>
            <t>To be valid, the index selector value <bcp14>MUST</bcp14> be in the I-JSON
range of exact values, see <xref target="synsem-overview"/>.</t>
            <t>Notes:</t>
            <ul spacing="normal">
              <li>An <tt>index-selector</tt> is an integer (in base 10, as in JSON numbers).</li>
              <li>As in JSON numbers, the syntax does not allow octal-like integers with leading zeros such as <tt>01</tt> or <tt>-01</tt>.</li>
            </ul>
          </section>
          <section anchor="index-semantics">
            <name>Semantics</name>
            <t>A non-negative <tt>index-selector</tt> applied to an array selects an array element using a zero-based index.
For example, the selector <tt>0</tt> selects the first and the selector <tt>4</tt> selects the fifth element of a sufficiently long array.
Nothing is selected, and it is not an error, if the index lies outside the range of the array. Nothing is selected from a value that is not an array.</t>
            <t>A negative <tt>index-selector</tt> counts from the array end backwards,
obtaining an equivalent non-negative <tt>index-selector</tt> by summing the
length of the array with the negative index.
For example, the selector <tt>-1</tt> selects the last and the selector <tt>-2</tt> selects the penultimate element of an array with at least two elements.
As with non-negative indexes, it is not an error if such an element does
not exist; this simply means that no element is selected.</t>
          </section>
          <section anchor="examples-3">
            <name>Examples</name>
            <!-- EDITING NOTE: there are non-breaking spaces here between j and j -->
<!-- i.e., j j and not j j -->

<t>JSON:</t>
            <sourcecode type="json"><![CDATA[
["a","b"]
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-index"/> show the index selector in use by a child segment.</t>
            <table anchor="tbl-index">
              <name>Index selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[1]</tt></td>
                  <td align="left">
                    <tt>"b"</tt></td>
                  <td align="center">
                    <tt>$[1]</tt></td>
                  <td align="left">Element of array</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[-2]</tt></td>
                  <td align="left">
                    <tt>"a"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt></td>
                  <td align="left">Element of array, from the end</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="slice">
          <name>Array Slice selector</name>
          <section anchor="syntax-3">
            <name>Syntax</name>
            <t>The array slice selector has the form <tt>&lt;start&gt;:&lt;end&gt;:&lt;step&gt;</tt>.
It matches elements from arrays starting at index <tt>&lt;start&gt;</tt>, ending at — but
not including — <tt>&lt;end&gt;</tt>, while incrementing by <tt>step</tt> with a default of <tt>1</tt>.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
slice-selector      = [start S] ":" S [end S] [":" [S step ]]

start               = int       ; included in selection
end                 = int       ; not included in selection
step                = int       ; default: 1
]]></sourcecode>
            <t>The slice selector consists of three optional decimal integers separated by colons.
The second colon can be omitted when the third integer is.</t>
            <t>To be valid, the integers provided <bcp14>MUST</bcp14> be in the I-JSON
range of exact values, see <xref target="synsem-overview"/>.</t>
          </section>
          <section anchor="semantics-4">
            <name>Semantics</name>
            <t>The slice selector was inspired by the slice operator of ECMAScript
4 (ES4), which was deprecated in 2014, and that of Python.</t>
            <section anchor="informal-introduction">
              <name>Informal Introduction</name>
              <t>This section is informative.</t>
              <t>Array slicing is inspired by the behavior of the <tt>Array.prototype.slice</tt> method
of the JavaScript language as defined by the ECMA-262 standard <xref target="ECMA-262"/>,
with the addition of the <tt>step</tt> parameter, which is inspired by the Python slice expression.</t>
              <t>The array slice expression <tt>start:end:step</tt> selects elements at indices starting at <tt>start</tt>,
incrementing by <tt>step</tt>, and ending with <tt>end</tt> (which is itself excluded).
So, for example, the expression <tt>1:3</tt> (where <tt>step</tt> defaults to <tt>1</tt>)
selects elements with indices <tt>1</tt> and <tt>2</tt> (in that order) whereas
<tt>1:5:2</tt> selects elements with indices <tt>1</tt> and <tt>3</tt>.</t>
              <t>When <tt>step</tt> is negative, elements are selected in reverse order. Thus,
for example, <tt>5:1:-2</tt> selects elements with indices <tt>5</tt> and <tt>3</tt>, in
that order and <tt>::-1</tt> selects all the elements of an array in
reverse order.</t>
              <t>When <tt>step</tt> is <tt>0</tt>, no elements are selected.
(This is the one case that differs from the behavior of Python, which
raises an error in this case.)</t>
              <t>The following section specifies the behavior fully, without depending on
JavaScript or Python behavior.</t>
            </section>
            <section anchor="normative-semantics">
              <name>Normative Semantics</name>
              <t>A slice expression selects a subset of the elements of the input array, in
the same order
as the array or the reverse order, depending on the sign of the <tt>step</tt> parameter.
It selects no nodes from a node that is not an array.</t>
              <t>A slice is defined by the two slice parameters, <tt>start</tt> and <tt>end</tt>, and
an iteration delta, <tt>step</tt>.
Each of these parameters is
optional. In the rest of this section, <tt>len</tt> denotes the length of the input array.</t>
              <t>The default value for <tt>step</tt> is <tt>1</tt>.
The default values for <tt>start</tt> and <tt>end</tt> depend on the sign of <tt>step</tt>,
as shown in <xref target="tbl-slice-start-end"/>:</t>
              <table anchor="tbl-slice-start-end">
                <name>Default array slice start and end values</name>
                <thead>
                  <tr>
                    <th align="left">Condition</th>
                    <th align="left">start</th>
                    <th align="left">end</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td align="left">step &gt;= 0</td>
                    <td align="left">0</td>
                    <td align="left">len</td>
                  </tr>
                  <tr>
                    <td align="left">step &lt; 0</td>
                    <td align="left">len - 1</td>
                    <td align="left">-len - 1</td>
                  </tr>
                </tbody>
              </table>
              <t>Slice expression parameters <tt>start</tt> and <tt>end</tt> are not directly usable
as slice bounds and must first be normalized.
Normalization for this purpose is defined as:</t>
              <sourcecode type="pseudocode"><![CDATA[
FUNCTION Normalize(i, len):
  IF i >= 0 THEN
    RETURN i
  ELSE
    RETURN len + i
  END IF
]]></sourcecode>
              <t>The result of the array index expression <tt>i</tt> applied to an array
of length <tt>len</tt> is the result of the array
slicing expression <tt>Normalize(i, len):Normalize(i, len)+1:1</tt>.</t>
              <t>Slice expression parameters <tt>start</tt> and <tt>end</tt> are used to derive slice bounds <tt>lower</tt> and <tt>upper</tt>.
The direction of the iteration, defined
by the sign of <tt>step</tt>, determines which of the parameters is the lower bound and which
is the upper bound:</t>
              <sourcecode type="pseudocode"><![CDATA[
FUNCTION Bounds(start, end, step, len):
  n_start = Normalize(start, len)
  n_end = Normalize(end, len)

  IF step >= 0 THEN
    lower = MIN(MAX(n_start, 0), len)
    upper = MIN(MAX(n_end, 0), len)
  ELSE
    upper = MIN(MAX(n_start, -1), len-1)
    lower = MIN(MAX(n_end, -1), len-1)
  END IF

  RETURN (lower, upper)
]]></sourcecode>
              <t>The slice expression selects elements with indices between the lower and
upper bounds.
In the following pseudocode, <tt>a(i)</tt> is the <tt>i+1</tt>th element of the array <tt>a</tt>
(i.e., <tt>a(0)</tt> is the first element, <tt>a(1)</tt> the second, and so forth).</t>
              <sourcecode type="pseudocode"><![CDATA[
IF step > 0 THEN

  i = lower
  WHILE i < upper:
    SELECT a(i)
    i = i + step
  END WHILE

ELSE if step < 0 THEN

  i = upper
  WHILE lower < i:
    SELECT a(i)
    i = i + step
  END WHILE

END IF
]]></sourcecode>
              <t>When <tt>step = 0</tt>, no elements are selected and the result array is empty.</t>
            </section>
          </section>
          <section anchor="examples-4">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
["a", "b", "c", "d", "e", "f", "g"]
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-slice"/> show the array slice selector in use by a child segment:</t>
            <table anchor="tbl-slice">
              <name>Array slice selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[1:3]</tt></td>
                  <td align="left">
                    <tt>"b"</tt> <br/> <tt>"c"</tt></td>
                  <td align="center">
                    <tt>$[1]</tt> <br/> <tt>$[2]</tt></td>
                  <td align="left">Slice with default step</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[5:]</tt></td>
                  <td align="left">
                    <tt>"f"</tt> <br/> <tt>"g"</tt></td>
                  <td align="center">
                    <tt>$[5]</tt> <br/> <tt>$[6]</tt></td>
                  <td align="left">Slice with no end index</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[1:5:2]</tt></td>
                  <td align="left">
                    <tt>"b"</tt> <br/> <tt>"d"</tt></td>
                  <td align="center">
                    <tt>$[1]</tt> <br/> <tt>$[3]</tt></td>
                  <td align="left">Slice with step 2</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[5:1:-2]</tt></td>
                  <td align="left">
                    <tt>"f"</tt> <br/> <tt>"d"</tt></td>
                  <td align="center">
                    <tt>$[5]</tt> <br/> <tt>$[3]</tt></td>
                  <td align="left">Slice with negative step</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[::-1]</tt></td>
                  <td align="left">
                    <tt>"g"</tt> <br/> <tt>"f"</tt> <br/> <tt>"e"</tt> <br/> <tt>"d"</tt> <br/> <tt>"c"</tt> <br/> <tt>"b"</tt> <br/> <tt>"a"</tt></td>
                  <td align="center">
                    <tt>$[6]</tt> <br/> <tt>$[5]</tt> <br/> <tt>$[4]</tt> <br/> <tt>$[3]</tt> <br/> <tt>$[2]</tt> <br/> <tt>$[1]</tt> <br/> <tt>$[0]</tt></td>
                  <td align="left">Slice in reverse order</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="filter-selector">
          <name>Filter selector</name>
          <t>Filter selectors are used to iterate over the elements or members of
structured values, i.e., JSON arrays and objects.
The structured values are identified in the nodelist offered by the
child or descendant segment using the filter selector.</t>
          <t>For each iteration (element/member), a logical expression, the <em>filter expression</em>,
is evaluated which decides whether the node of
the element/member is selected.
(While a logical expression evaluates to what mathematically is a
Boolean value, this specification uses the term <em>logical</em> to maintain a distinction from
the Boolean values that JSON can represent.)</t>
          <t>During the iteration process, the filter expression receives the node
of each array element or object member value of the structured value being
filtered; this element or member value is then known as the <em>current node</em>.</t>
          <t>The current node can be used as the start of one or more JSONPath
queries in subexpressions of the filter expression, notated
via the current-node-identifier <tt>@</tt>.
Each JSONPath query can be used either for testing existence of a
result of the query, for obtaining a specific JSON value resulting
from that query that can then be used in a comparison, or as a
<em>function argument</em>.</t>
          <t>Filter selectors may use function extensions, which are covered in <xref target="fnex"/>.
Within the logical expression for a filter selector, function
expressions can be used to operate on nodelists and values.
The set of available functions is extensible, with a number of
functions predefined, see <xref target="fnex"/>, and the ability to register further
functions provided by the Function Extensions sub-registry (<xref target="iana-fnex"/>).
When a function is defined, it is given a unique name, and its return value and each of its parameters is given a
<em>declared type</em>.
The type system is limited in scope; its purpose is to express
restrictions that, without functions, are implicit in the grammar of
filter expressions.
The type system also guides conversions (<xref target="type-conv"/>) that mimic the
way different kinds of expressions are handled in the grammar when
function expressions are not in use.</t>
          <section anchor="filter-selector-syntax">
            <name>Syntax</name>
            <t>The filter selector has the form <tt>?&lt;logical-expr&gt;</tt>.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
filter-selector     = "?" S logical-expr
]]></sourcecode>
            <t>As the filter expression is composed of side-effect free constituents,
the order of evaluation does not need to be (and is not) defined.
Similarly, for conjunction (<tt>&amp;&amp;</tt>) and disjunction (<tt>||</tt>) (defined later),
both a short-circuiting and a fully evaluating
implementation will lead to the same result; both implementation
strategies are therefore valid.</t>
            <t>The current node is accessible via the current node identifier <tt>@</tt>.
This identifier addresses the current node of the filter-selector that
is directly enclosing the identifier. Note: within nested
filter-selectors, there is no syntax to address the current node of
any other than the directly enclosing filter-selector (i.e., of
filter-selectors enclosing the filter-selector that is directly
enclosing the identifier).</t>
            <t>Logical expressions offer the usual Boolean operators (<tt>||</tt> for OR,
<tt>&amp;&amp;</tt> for AND, and <tt>!</tt> for NOT).
They have the normal semantics of Boolean algebra and obey its laws
(see, for example, <xref target="BOOLEAN-LAWS"/>).
Parentheses <bcp14>MAY</bcp14> be used within <tt>logical-expr</tt> for grouping.</t>
            <t>It is not required that <tt>logical-expr</tt> consist of
a parenthesized expression (which was required in <xref target="JSONPath-orig"/>),
although it can be, and the semantics are the same
as without the parentheses.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
logical-expr        = logical-or-expr
logical-or-expr     = logical-and-expr *(S "||" S logical-and-expr)
                        ; disjunction
                        ; binds less tightly than conjunction
logical-and-expr    = basic-expr *(S "&&" S basic-expr)
                        ; conjunction
                        ; binds more tightly than disjunction

basic-expr          = paren-expr /
                      comparison-expr /
                      test-expr

paren-expr          = [logical-not-op S] "(" S logical-expr S ")"
                                        ; parenthesized expression
logical-not-op      = "!"               ; logical NOT operator
]]></sourcecode>
            <t>A test expression
either tests the existence of a node
designated by an embedded query (see <xref target="extest"/>) or tests the
result of a function expression (see <xref target="fnex"/>).
In the latter case, if the function's declared result type is
<tt>LogicalType</tt> (see <xref target="typesys"/>), it tests whether the result
is <tt>LogicalTrue</tt>; if the function's declared result type is
<tt>NodesType</tt>, it tests whether the result is non-empty.
If the function's declared result type is <tt>ValueType</tt>, its use in a
test expression is not well-typed (see <xref target="well-typedness"/>).</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
test-expr           = [logical-not-op S]
                     (filter-query / ; existence/non-existence
                      function-expr) ; LogicalType or
                                     ; NodesType
filter-query        = rel-query / jsonpath-query
rel-query           = current-node-identifier segments
current-node-identifier = "@"
]]></sourcecode>
            <t>Comparison expressions are available for comparisons between primitive
values (that is, numbers, strings, <tt>true</tt>, <tt>false</tt>, and <tt>null</tt>).
These can be obtained via literal values; singular queries, each of
which selects at most one node the value of which is then used; or
function expressions (see <xref target="fnex"/>) of type <tt>ValueType</tt>.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
comparison-expr     = comparable S comparison-op S comparable
literal             = number / string-literal /
                      true / false / null
comparable          = literal /
                      singular-query / ; singular query value
                      function-expr    ; ValueType
comparison-op       = "==" / "!=" /
                      "<=" / ">=" /
                      "<"  / ">"

singular-query      = rel-singular-query / abs-singular-query
rel-singular-query  = current-node-identifier singular-query-segments
abs-singular-query  = root-identifier singular-query-segments
singular-query-segments = *(S (name-segment / index-segment))
name-segment        = ("[" name-selector "]") /
                      ("." member-name-shorthand)
index-segment       = "[" index-selector "]"
]]></sourcecode>
            <t>Literals can be notated in the way that is usual for JSON (with the
extension that strings can use single-quote delimiters).</t>
            <t>Note: Alphabetic characters in ABNF quoted strings are case-insensitive, so within a
floating point number the ABNF expression "e" can be either the character
'e' or 'E'.</t>
            <t><tt>true</tt>, <tt>false</tt>, and <tt>null</tt> are lower-case only (case-sensitive).</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
number              = (int / "-0") [ frac ] [ exp ] ; decimal number
frac                = "." 1*DIGIT                  ; decimal fraction
exp                 = "e" [ "-" / "+" ] 1*DIGIT    ; decimal exponent
true                = %x74.72.75.65                ; true
false               = %x66.61.6c.73.65             ; false
null                = %x6e.75.6c.6c                ; null
]]></sourcecode>
            <t><xref target="tbl-prec"/> lists filter expression operators in order of precedence from highest (binds most tightly) to lowest (binds least tightly).</t>
            <!-- FIXME: Should the syntax column be split between unary and binary operators? -->

<table anchor="tbl-prec">
              <name>Filter expression operator precedence</name>
              <thead>
                <tr>
                  <th align="center">Precedence</th>
                  <th align="center">Operator type</th>
                  <th align="center">Syntax</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">5</td>
                  <td align="center">Grouping <br/> Function Expressions</td>
                  <td align="center">
                    <tt>(...)</tt> <br/> <em>name</em><tt>(...)</tt></td>
                </tr>
                <tr>
                  <td align="center">4</td>
                  <td align="center">Logical NOT</td>
                  <td align="center">
                    <tt>!</tt></td>
                </tr>
                <tr>
                  <td align="center">3</td>
                  <td align="center">Relations</td>
                  <td align="center">
                    <tt>==</tt> <tt>!=</tt><br/><tt>&lt;</tt> <tt>&lt;=</tt> <tt>&gt;</tt> <tt>&gt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">2</td>
                  <td align="center">Logical AND</td>
                  <td align="center">
                    <tt>&amp;&amp;</tt></td>
                </tr>
                <tr>
                  <td align="center">1</td>
                  <td align="center">Logical OR</td>
                  <td align="center">
                    <tt>||</tt></td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="semantics-5">
            <name>Semantics</name>
            <t>The filter selector works with arrays and objects exclusively. Its result is a list of <em>zero</em>, <em>one</em>, <em>multiple</em> or <em>all</em> of their array elements or member values, respectively.
Applied to a primitive value, it selects nothing (and therefore does
not contribute to the result of the filter selector).</t>
            <t>In the resultant nodelist, children of an array are ordered by their position in the array.
The order in which the children of an object (as opposed to an array)
appear in the resultant nodelist is not stipulated,
since JSON objects are unordered.</t>
            <section anchor="extest">
              <name>Existence Tests</name>
              <t>A query by itself in a logical context is an existence test which yields true if the query selects at least one node and yields false if the query does not select any nodes.</t>
              <t>Existence tests differ from comparisons in that:</t>
              <ul spacing="normal">
                <li>they work with arbitrary relative or absolute queries (not just singular queries).</li>
                <li>they work with queries that select structured values.</li>
              </ul>
              <t>To examine the value of a node selected by a query, an explicit comparison is necessary.
For example, to test whether the node selected by the query <tt>@.foo</tt> has the value <tt>null</tt>, use <tt>@.foo == null</tt> (see <xref target="null-semantics"/>)
rather than the negated existence test <tt>!@.foo</tt> (which yields false if <tt>@.foo</tt> selects a node, regardless of the node's value).</t>
            </section>
            <section anchor="comparisons">
              <name>Comparisons</name>
              <t>The comparison operators <tt>==</tt> and <tt>&lt;</tt> are defined first and then these are used to define <tt>!=</tt>, <tt>&lt;=</tt>, <tt>&gt;</tt>, and <tt>&gt;=</tt>.</t>
              <t>When either side of a comparison results in an empty nodelist or the
special result <tt>Nothing</tt> (see <xref target="typesys"/>):</t>
              <ul spacing="normal">
                <li>a comparison using the operator <tt>==</tt> yields true if and only the
other side also results in an empty nodelist or the special result <tt>Nothing</tt>.</li>
                <li>a comparison using the operator <tt>&lt;</tt> yields false.</li>
              </ul>
              <t>When any query or function expression on either side of a comparison results in a nodelist consisting of a single node, that side is
replaced by the value of its node and then:</t>
              <ul spacing="normal">
                <li>
                  <t>a comparison using the operator <tt>==</tt> yields true if and only if the comparison
is between:
                  </t>
                  <ul spacing="normal">
                    <li>numbers expected to interoperate as per <xref section="2.2" sectionFormat="of" target="RFC7493">I-JSON</xref> that compare equal using normal mathematical equality,</li>
                    <li>numbers at least one of which is not expected to interoperate as per I-JSON, where the numbers compare equal using an implementation specific equality,</li>
                    <li>equal primitive values which are not numbers,</li>
                    <li>equal arrays, that is arrays of the same length where each element of the first array is equal to the corresponding
element of the second array, or</li>
                    <li>
                      <t>equal objects with no duplicate names, that is where:
                      </t>
                      <ul spacing="normal">
                        <li>both objects have the same collection of names (with no duplicates), and</li>
                        <li>for each of those names, the values associated with the name by the objects are equal.</li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>a comparison using the operator <tt>&lt;</tt> yields true if and only if
the comparison is between values which are both numbers or both strings and which satisfy the comparison:  </t>
                  <ul spacing="normal">
                    <li>numbers expected to interoperate as per <xref section="2.2" sectionFormat="of" target="RFC7493">I-JSON</xref> <bcp14>MUST</bcp14> compare using the normal mathematical ordering;
numbers not expected to interoperate as per I-JSON <bcp14>MAY</bcp14> compare using an implementation specific ordering</li>
                    <li>the empty string compares less than any non-empty string</li>
                    <li>a non-empty string compares less than another non-empty string if and only if the first string starts with a
lower Unicode scalar value than the second string or if both strings start with the same Unicode scalar value and
the remainder of the first string compares less than the remainder of the second string.</li>
                  </ul>
                </li>
              </ul>
              <t><tt>!=</tt>, <tt>&lt;=</tt>, <tt>&gt;</tt>, and <tt>&gt;=</tt> are defined in terms of the other comparison operators. For any <tt>a</tt> and <tt>b</tt>:</t>
              <ul spacing="normal">
                <li>The comparison <tt>a != b</tt> yields true if and only if <tt>a == b</tt> yields false.</li>
                <li>The comparison <tt>a &lt;= b</tt> yields true if and only if <tt>a &lt; b</tt> yields true or <tt>a == b</tt> yields true.</li>
                <li>The comparison <tt>a &gt; b</tt> yields true if and only if <tt>b &lt; a</tt> yields true.</li>
                <li>The comparison <tt>a &gt;= b</tt> yields true if and only if <tt>b &lt; a</tt> yields true or <tt>a == b</tt> yields true.</li>
              </ul>
            </section>
          </section>
          <section anchor="examples-5">
            <name>Examples</name>
            <t>The first set of examples shows some comparison expressions and their
result with a given JSON value as input.</t>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "obj": {"x": "y"},
  "arr": [2, 3]
}
]]></sourcecode>
            <t>Comparisons:</t>
            <table anchor="tbl-comparison">
              <name>Comparison examples</name>
              <thead>
                <tr>
                  <th align="center">Comparison</th>
                  <th align="center">Result</th>
                  <th align="center">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$.absent1 == $.absent2</tt></td>
                  <td align="center">true</td>
                  <td align="center">Empty nodelists</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent1 &lt;= $.absent2</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent == 'g'</tt></td>
                  <td align="center">false</td>
                  <td align="center">Empty nodelist</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent1 != $.absent2</tt></td>
                  <td align="center">false</td>
                  <td align="center">Empty nodelists</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.absent != 'g'</tt></td>
                  <td align="center">true</td>
                  <td align="center">Empty nodelist</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt;= 2</tt></td>
                  <td align="center">true</td>
                  <td align="center">Numeric comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt; 2</tt></td>
                  <td align="center">false</td>
                  <td align="center">Strict, numeric comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>13 == '13'</tt></td>
                  <td align="center">false</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>'a' &lt;= 'b'</tt></td>
                  <td align="center">true</td>
                  <td align="center">String comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>'a' &gt; 'b'</tt></td>
                  <td align="center">false</td>
                  <td align="center">Strict, string comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj == $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj != $.arr</tt></td>
                  <td align="center">true</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj == $.obj</tt></td>
                  <td align="center">true</td>
                  <td align="center">Object comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj != $.obj</tt></td>
                  <td align="center">false</td>
                  <td align="center">Object comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.arr == $.arr</tt></td>
                  <td align="center">true</td>
                  <td align="center">Array comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.arr != $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Array comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj == 17</tt></td>
                  <td align="center">false</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj != 17</tt></td>
                  <td align="center">true</td>
                  <td align="center">Type mismatch</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Objects and arrays do not offer <tt>&lt;</tt> comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Objects and arrays do not offer <tt>&lt;</tt> comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt;= $.obj</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.arr &lt;= $.arr</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays do not offer <tt>&lt;</tt> comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays do not offer <tt>&lt;</tt> comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays do not offer <tt>&lt;</tt> comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays do not offer <tt>&lt;</tt> comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>true &lt;= true</tt></td>
                  <td align="center">true</td>
                  <td align="center">
                    <tt>==</tt> implies <tt>&lt;=</tt></td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>true &gt; true</tt></td>
                  <td align="center">false</td>
                  <td align="center">Booleans do not offer <tt>&lt;</tt> comparison</td>
                </tr>
              </tbody>
            </table>
            <t>The second set of examples shows some complete JSONPath queries that make use
of filter selectors, and the results of evaluating these queries on a
given JSON value as input.
(Note: two of the queries employ function extensions; please see
Sections <xref format="counter" target="match"/> and <xref format="counter" target="search"/> below for details about these.)</t>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "a": [3, 5, 1, 2, 4, 6,
        {"b": "j"},
        {"b": "k"},
        {"b": {}},
        {"b": "kilo"}
       ],
  "o": {"p": 1, "q": 2, "r": 3, "s": 5, "t": {"u": 6}},
  "e": "f"
}
]]></sourcecode>
            <t>Queries:</t>
            <t>The examples in <xref target="tbl-filter"/> show the filter selector in use by a child segment:</t>
            <table anchor="tbl-filter">
              <name>Filter selector examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$.a[?@.b == 'kilo']</tt></td>
                  <td align="left">
                    <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][9]</tt></td>
                  <td align="left">Member value comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?(@.b == 'kilo')]</tt></td>
                  <td align="left">
                    <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][9]</tt></td>
                  <td align="left">Equivalent query with enclosing parentheses</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@&gt;3.5]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>4</tt> <br/> <tt>6</tt></td>
                  <td align="center">
                    <tt>$['a'][1]</tt> <br/> <tt>$['a'][4]</tt> <br/> <tt>$['a'][5]</tt></td>
                  <td align="left">Array value comparison</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@.b]</tt></td>
                  <td align="left">
                    <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt> <br/> <tt>{"b": {}}</tt> <br/> <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][6]</tt> <br/> <tt>$['a'][7]</tt> <br/> <tt>$['a'][8]</tt> <br/> <tt>$['a'][9]</tt></td>
                  <td align="left">Array value existence</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[?@.*]</tt></td>
                  <td align="left">
                    <tt>[3, 5, 1, 2, 4, 6, {"b": "j"}, {"b": "k"}, {"b": {}}, {"b": "kilo"}]</tt> <br/> <tt>{"p": 1, "q": 2, "r": 3, "s": 5, "t": {"u": 6}}</tt></td>
                  <td align="center">
                    <tt>$['a']</tt> <br/> <tt>$['o']</tt></td>
                  <td align="left">Existence of non-singular queries</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[?@[?@.b]]</tt></td>
                  <td align="left">
                    <tt>[3, 5, 1, 2, 4, 6, {"b": "j"}, {"b": "k"}, {"b": {}}, {"b": "kilo"}]</tt></td>
                  <td align="center">
                    <tt>$['a']</tt></td>
                  <td align="left">Nested filters</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@&lt;3, ?@&lt;3]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['p']</tt> <br/> <tt>$['o']['q']</tt> <br/> <tt>$['o']['q']</tt> <br/> <tt>$['o']['p']</tt></td>
                  <td align="left">Non-deterministic ordering</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@&lt;2 || @.b == "k"]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>{"b": "k"}</tt></td>
                  <td align="center">
                    <tt>$['a'][2]</tt> <br/> <tt>$['a'][7]</tt></td>
                  <td align="left">Array value logical OR</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?match(@.b, "[jk]")]</tt></td>
                  <td align="left">
                    <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt></td>
                  <td align="center">
                    <tt>$['a'][6]</tt> <br/> <tt>$['a'][7]</tt></td>
                  <td align="left">Array value regular expression match</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?search(@.b, "[jk]")]</tt></td>
                  <td align="left">
                    <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt> <br/> <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][6]</tt> <br/> <tt>$['a'][7]</tt> <br/> <tt>$['a'][9]</tt></td>
                  <td align="left">Array value regular expression search</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@&gt;1 &amp;&amp; @&lt;4]</tt></td>
                  <td align="left">
                    <tt>2</tt> <br/> <tt>3</tt></td>
                  <td align="center">
                    <tt>$['o']['q']</tt> <br/> <tt>$['o']['r']</tt></td>
                  <td align="left">Object value logical AND</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@&gt;1 &amp;&amp; @&lt;4]</tt></td>
                  <td align="left">
                    <tt>3</tt> <br/> <tt>2</tt></td>
                  <td align="center">
                    <tt>$['o']['r']</tt> <br/> <tt>$['o']['q']</tt></td>
                  <td align="left">Alternative result</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o[?@.u || @.x]</tt></td>
                  <td align="left">
                    <tt>{"u": 6}</tt></td>
                  <td align="center">
                    <tt>$['o']['t']</tt></td>
                  <td align="left">Object value logical OR</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@.b == $.x]</tt></td>
                  <td align="left">
                    <tt>3</tt> <br/> <tt>5</tt> <br/> <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>4</tt> <br/> <tt>6</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/><tt>$['a'][1]</tt> <br/> <tt>$['a'][2]</tt> <br/> <tt>$['a'][3]</tt> <br/> <tt>$['a'][4]</tt> <br/> <tt>$['a'][5]</tt></td>
                  <td align="left">Comparison of queries with no values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a[?@ == @]</tt></td>
                  <td align="left">
                    <tt>3</tt> <br/> <tt>5</tt> <br/> <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>4</tt> <br/> <tt>6</tt> <br/> <tt>{"b": "j"}</tt> <br/> <tt>{"b": "k"}</tt> <br/> <tt>{"b": {}}</tt> <br/> <tt>{"b": "kilo"}</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt> <br/><tt>$['a'][2]</tt> <br/><tt>$['a'][3]</tt> <br/><tt>$['a'][4]</tt> <br/><tt>$['a'][5]</tt> <br/><tt>$['a'][6]</tt> <br/><tt>$['a'][7]</tt> <br/><tt>$['a'][8]</tt> <br/><tt>$['a'][9]</tt></td>
                  <td align="left">Comparisons of primitive and of structured values</td>
                </tr>
              </tbody>
            </table>
            <t>The example above with the query <tt>$.o[?@&lt;3, ?@&lt;3]</tt> shows that a filter selector may produce nodelists in distinct
orders each time it appears in the child segment.</t>
          </section>
        </section>
      </section>
      <section anchor="fnex">
        <name>Function Extensions</name>
        <t>Beyond the filter expression functionality defined in the preceding
subsections, JSONPath defines an extension point that can be used to
add filter expression functionality: "Function Extensions".</t>
        <t>This section defines the extension point as well as some function
extensions that use this extension point.
While these mechanisms are designed to use the extension point,
they are an integral part of the JSONPath specification and are
expected to be implemented like any other integral part of this
specification.</t>
        <t>A function extension defines a registered name (see <xref target="iana-fnex"/>) that
can be applied to a sequence of zero or more arguments, producing a
result. Each registered function name is unique.</t>
        <t>A function extension <bcp14>MUST</bcp14> be defined such that its evaluation is
side-effect free, i.e., all possible orders of evaluation and choices
of short-circuiting or full evaluation of an expression containing it
<bcp14>MUST</bcp14> lead to the same result.
(Note: memoization or logging are not side effects in this sense
as they are visible at the implementation level only — they do not
influence the result of the evaluation.)</t>
        <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
function-name       = function-name-first *function-name-char
function-name-first = LCALPHA
function-name-char  = function-name-first / "_" / DIGIT
LCALPHA             = %x61-7A  ; "a".."z"

function-expr       = function-name "(" S [function-argument
                         *(S "," S function-argument)] S ")"
function-argument   = literal /
                      filter-query / ; (includes singular-query)
                      logical-expr /
                      function-expr
]]></sourcecode>
        <t>Any function expressions in a query must be well-formed (by conforming to the above ABNF)
and well-typed,
otherwise the JSONPath implementation <bcp14>MUST</bcp14> raise an error
(see <xref target="synsem-overview"/>).
To define which function expressions are well-typed,
a type system is first introduced.</t>
        <section anchor="typesys">
          <name>Type System for Function Expressions</name>
          <t>Each parameter as well as the result of a function extension must have a declared type.</t>
          <t>Declared types enable checking a JSONPath query for well-typedness
independent of any query argument the JSONPath query is applied to.</t>
          <t><xref target="tbl-types"/> defines the available types in terms of the instances they contain.</t>
          <table anchor="tbl-types">
            <name>Function extension type system</name>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Instances</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>ValueType</tt></td>
                <td align="left">JSON values or <tt>Nothing</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>LogicalType</tt></td>
                <td align="left">
                  <tt>LogicalTrue</tt> or <tt>LogicalFalse</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>NodesType</tt></td>
                <td align="left">Nodelists</td>
              </tr>
            </tbody>
          </table>
          <t>Notes:</t>
          <ul spacing="normal">
            <li>The only instances that can be directly represented in JSONPath syntax are certain JSON values
in <tt>ValueType</tt> expressed as literals (which, in JSONPath, are limited to primitive values).</li>
            <li>The special result <tt>Nothing</tt> represents the absence of a JSON value and is distinct from any JSON value, including <tt>null</tt>.</li>
            <li>
              <tt>LogicalTrue</tt> and <tt>LogicalFalse</tt> are unrelated to the JSON values expressed by the
literals <tt>true</tt> and <tt>false</tt>.</li>
          </ul>
        </section>
        <section anchor="type-conv">
          <name>Type Conversion</name>
          <t>Just as queries can be used in logical expressions by testing for the
existence of at least one node (<xref target="extest"/>), a function expression of
declared type <tt>NodesType</tt> can be used as a function argument for a
parameter of declared type <tt>LogicalType</tt>, with the equivalent conversion rule:</t>
          <ul spacing="normal">
            <li>If the nodelist contains one or more nodes, the conversion result is <tt>LogicalTrue</tt>.</li>
            <li>If the nodelist is empty, the conversion result is <tt>LogicalFalse</tt>.</li>
          </ul>
          <t>Notes:</t>
          <ul spacing="normal">
            <li>Extraction of a value from a nodelist can be performed in several
ways, so an implicit conversion from <tt>NodesType</tt> to <tt>ValueType</tt>
may be surprising and has therefore not been defined.</li>
            <li>A function expression with a declared type of <tt>NodesType</tt> can
indirectly be used as an argument for a parameter of declared type
<tt>ValueType</tt> by wrapping the expression in a call to a function extension,
such as <tt>value()</tt> (see <xref target="value"/>),
that takes a parameter of type <tt>NodesType</tt> and returns a
result of type <tt>ValueType</tt>.</li>
          </ul>
          <t>The well-typedness of function expressions can now be defined in terms of this type system.</t>
        </section>
        <section anchor="well-typedness">
          <name>Well-Typedness of Function Expressions</name>
          <t>For a function expression to be well-typed:</t>
          <ol spacing="normal" type="1"><li>its declared type must be well-typed in the context in which it occurs, and</li>
            <li>its arguments must be well-typed for the declared type of the corresponding parameters.</li>
          </ol>
          <t>(1) As per the grammar, a function expression can occur in three different
immediate contexts, which lead to the following conditions for well-typedness:</t>
          <dl newline="true">
            <dt>As a <tt>test-expr</tt> in a logical expression:</dt>
            <dd>
              <t>The function's declared result type is <tt>LogicalType</tt>, or
(giving rise to conversion as per <xref target="type-conv"/>) <tt>NodesType</tt>.</t>
            </dd>
            <dt>As a <tt>comparable</tt> in a comparison:</dt>
            <dd>
              <t>The function's declared result type is <tt>ValueType</tt>.</t>
            </dd>
            <dt>As a <tt>function-argument</tt> in another function expression:</dt>
            <dd>
              <t>The function's declared result type fulfills the following rules for
the corresponding parameter of the enclosing function.</t>
            </dd>
          </dl>
          <t>(2) The arguments of the function expression are well-typed when
each argument of the function can be used for the declared type of the
corresponding parameter, according to one of the following
conditions:</t>
          <ul spacing="normal">
            <li>When the argument is a function expression with declared result type the same as the
declared type of the parameter.</li>
            <li>
              <t>When the declared type of the parameter is <tt>LogicalType</tt> and the argument is one of the following:
              </t>
              <ul spacing="normal">
                <li>A function expression with declared result type <tt>NodesType</tt>.
In this case the argument is converted to LogicalType as per <xref target="type-conv"/>.</li>
                <li>A <tt>logical-expr</tt> that is not a function expression.</li>
              </ul>
            </li>
            <li>When the declared type of the parameter is <tt>NodesType</tt> and the argument is a query
(which includes singular query).</li>
            <li>
              <t>When the declared type of the parameter is <tt>ValueType</tt> and the argument is one of the following:
              </t>
              <ul spacing="normal">
                <li>A value expressed as a literal.</li>
                <li>
                  <t>A singular query. In this case:
                  </t>
                  <ul spacing="normal">
                    <li>If the query results in a nodelist consisting of a single node, the
argument is the value of the node.</li>
                    <li>If the query results in an empty nodelist, the argument is
the special result <tt>Nothing</tt>.</li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="length">
          <name><tt>length()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>ValueType</tt></li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>ValueType</tt> (unsigned integer or <tt>Nothing</tt>)</t>
            </dd>
          </dl>
          <t>The <tt>length()</tt> function extension provides a way to compute the length
of a value and make that available for further processing in the
filter expression:</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?length(@.authors) >= 5]
]]></sourcecode>
          <t>Its only argument is an instance of <tt>ValueType</tt> (possibly taken from a
singular query, as in the example above).  The result also is an
instance of <tt>ValueType</tt>: an unsigned integer or the special result <tt>Nothing</tt>.</t>
          <ul spacing="normal">
            <li>If the argument value is a string, the result is the number of
Unicode scalar values in the string.</li>
            <li>If the argument value is an array, the result is the number of
elements in the array.</li>
            <li>If the argument value is an object, the result is the number of
members in the object.</li>
            <li>For any other argument value, the result is the special result <tt>Nothing</tt>.</li>
          </ul>
        </section>
        <section anchor="count">
          <name><tt>count()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>NodesType</tt></li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>ValueType</tt> (unsigned integer)</t>
            </dd>
          </dl>
          <t>The <tt>count()</tt> function extension provides a way to obtain the number of
nodes in a nodelist and make that available for further processing in
the filter expression:</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?count(@.*.author) >= 5]
]]></sourcecode>
          <t>Its only argument is a nodelist.
The result is a value, an unsigned integer, that gives the number of
nodes in the nodelist.
Notes:</t>
          <ul spacing="normal">
            <li>There is no deduplication of the nodelist.</li>
            <li>The number of nodes in the nodelist is counted independent of their
values or any children they may have; e.g., the count of a non-empty
singular nodelist such as <tt>count(@)</tt> is always 1.</li>
          </ul>
        </section>
        <section anchor="match">
          <name><tt>match()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>ValueType</tt> (string)</li>
                <li>
                  <tt>ValueType</tt> (string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>)</li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>LogicalType</tt></t>
            </dd>
          </dl>
          <t>The <tt>match()</tt> function extension provides a way to check whether (the
entirety of, see <xref target="search"/> below) a given
string matches a given regular expression, which is in <xref target="I-D.draft-ietf-jsonpath-iregexp"/> form.</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?match(@.date, "1974-05-..")]
]]></sourcecode>
          <t>Its arguments are instances of <tt>ValueType</tt> (possibly taken from a
singular query, as for the first argument in the example above).
If the first argument is not a string or the second argument is not a
string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>, the result is <tt>LogicalFalse</tt>.
Otherwise, the string that is the first argument is matched against
the iregexp contained in the string that is the second argument;
the result is <tt>LogicalTrue</tt> if the string matches the iregexp and
<tt>LogicalFalse</tt> otherwise.</t>
        </section>
        <section anchor="search">
          <name><tt>search()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>ValueType</tt> (string)</li>
                <li>
                  <tt>ValueType</tt> (string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>)</li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>LogicalType</tt></t>
            </dd>
          </dl>
          <t>The <tt>search()</tt> function extension provides a way to check whether a
given string contains a substring that matches a given regular
expression, which is in <xref target="I-D.draft-ietf-jsonpath-iregexp"/> form.</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?search(@.author, "[BR]ob")]
]]></sourcecode>
          <t>Its arguments are instances of <tt>ValueType</tt> (possibly taken from a
singular query, as for the first argument in the example above).
If the first argument is not a string or the second argument is not a
string conforming to <xref target="I-D.draft-ietf-jsonpath-iregexp"/>, the result is <tt>LogicalFalse</tt>.
Otherwise, the string that is the first argument is searched for at
least one substring that matches the iregexp contained in the string
that is the second argument; the result is <tt>LogicalTrue</tt> if such a
substring exists and <tt>LogicalFalse</tt> otherwise.</t>
        </section>
        <section anchor="value">
          <name><tt>value()</tt> Function Extension</name>
          <dl>
            <dt>Parameters:</dt>
            <dd>
              <ol spacing="normal" type="1"><li>
                  <tt>NodesType</tt></li>
              </ol>
            </dd>
            <dt>Result:</dt>
            <dd>
              <t><tt>ValueType</tt></t>
            </dd>
          </dl>
          <t>The <tt>value()</tt> function extension provides a way to convert an instance of <tt>NodesType</tt> to a value and
make that available for further processing in the filter expression:</t>
          <sourcecode type="JSONPath"><![CDATA[
$[?value(@..color) == "red"]
]]></sourcecode>
          <t>Its only argument is an instance of <tt>NodesType</tt> (possibly taken from a
<tt>filter-query</tt>, as in the example above).  The result is an
instance of <tt>ValueType</tt>.</t>
          <ul spacing="normal">
            <li>If the argument contains a single node, the result is
the value of the node.</li>
            <li>If the argument is the special result <tt>Nothing</tt> or contains multiple nodes, the
result is <tt>Nothing</tt>.</li>
          </ul>
          <t>Note: a singular query may be used anywhere where a ValueType is expected,
so there is no need to use the <tt>value()</tt> function extension with a singular query.</t>
        </section>
        <section anchor="examples-6">
          <name>Examples</name>
          <table anchor="tbl-function-expr">
            <name>Function expression examples</name>
            <thead>
              <tr>
                <th align="center">Query</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$[?length(@) &lt; 3]</tt></td>
                <td align="left">well-typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?length(@.*) &lt; 3]</tt></td>
                <td align="left">not well-typed since <tt>@.*</tt> is a non-singular query</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?count(@.*) == 1]</tt></td>
                <td align="left">well-typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?count(1) == 1]</tt></td>
                <td align="left">not well-typed since <tt>1</tt> is not a query or function expression</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?count(foo(@.*)) == 1]</tt></td>
                <td align="left">well-typed, where <tt>foo()</tt> is a function extension with a parameter of type <tt>NodesType</tt> and result type <tt>NodesType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?match(@.timezone, 'Europe/.*')]</tt></td>
                <td align="left">well-typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?match(@.timezone, 'Europe/.*') == true]</tt></td>
                <td align="left">not well-typed as <tt>LogicalType</tt> may not be used in comparisons</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?value(@..color) == "red"]</tt></td>
                <td align="left">well-typed</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?value(@..color)]</tt></td>
                <td align="left">not well-typed as <tt>ValueType</tt> may not be used in a test expression</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?bar(@.a)]</tt></td>
                <td align="left">well-typed for any function <tt>bar()</tt> with a parameter of any declared type and result type <tt>LogicalType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?bnl(@.*)]</tt></td>
                <td align="left">well-typed for any function <tt>bnl()</tt> with a parameter of declared type <tt>NodesType</tt> or <tt>LogicalType</tt> and result type <tt>LogicalType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?blt(1==1)]</tt></td>
                <td align="left">well-typed, where <tt>blt()</tt> is a function with a parameter of declared type <tt>LogicalType</tt> and result type <tt>LogicalType</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?blt(1)]</tt></td>
                <td align="left">not well-typed for the same function <tt>blt()</tt>, as <tt>1</tt> is not a query, <tt>logical-expr</tt>, or function expression</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[?bal(1)]</tt></td>
                <td align="left">well-typed, where <tt>bal()</tt> is a function with a parameter of declared type <tt>ValueType</tt> and result type <tt>LogicalType</tt></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="segments-details">
        <name>Segments</name>
        <t>For each node in an input nodelist,
segments apply one or more selectors to the node and concatenate the
results of each selector into per-input-node nodelists, which are then
concatenated in the order of the input nodelist to form a single
segment result nodelist.</t>
        <t>It turns out that the more segments there are in a query, the greater the depth in the input value of the
nodes of the resultant nodelist:</t>
        <ul spacing="normal">
          <li>A query with N segments, where N &gt;= 0, produces a nodelist
consisting of nodes at depth in the input value of N or greater.</li>
          <li>A query with N segments, where N &gt;= 0, all of which are <xref target="child-segment">child segments</xref>,
produces a nodelist consisting of nodes precisely at depth N in the input value.</li>
        </ul>
        <t>There are two kinds of segment: child segments and descendant segments.</t>
        <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
segment             = child-segment / descendant-segment
]]></sourcecode>
        <t>The syntax and semantics of each kind of segment are defined below.</t>
        <section anchor="child-segment">
          <name>Child Segment</name>
          <section anchor="syntax-4">
            <name>Syntax</name>
            <t>The child segment consists of a non-empty, comma-separated
sequence of selectors enclosed in square brackets.</t>
            <t>Shorthand notations are also provided for when there is a single
wildcard or name selector.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
child-segment       = bracketed-selection /
                      ("."
                       (wildcard-selector /
                        member-name-shorthand))

bracketed-selection = "[" S selector *(S "," S selector) S "]"

member-name-shorthand = name-first *name-char
name-first          = ALPHA /
                      "_"   /
                      %x80-10FFFF   ; any non-ASCII Unicode character
name-char           = DIGIT / name-first

DIGIT               = %x30-39              ; 0-9
ALPHA               = %x41-5A / %x61-7A    ; A-Z / a-z
]]></sourcecode>
            <t><tt>.*</tt>, a <tt>child-segment</tt> directly built from a <tt>wildcard-selector</tt>, is
shorthand for <tt>[*]</tt>.</t>
            <t><tt>.&lt;member-name&gt;</tt>, a <tt>child-segment</tt> built from a
 <tt>member-name-shorthand</tt>, is shorthand for <tt>['&lt;member-name&gt;']</tt>.
Note: this can only be used with member names that are composed of certain
characters, as specified in the ABNF rule <tt>member-name-shorthand</tt>.
Thus, for example, <tt>$.foo.bar</tt> is shorthand for <tt>$['foo']['bar']</tt> (but not for <tt>$['foo.bar']</tt>).</t>
          </section>
          <section anchor="semantics-6">
            <name>Semantics</name>
            <t>A child segment contains a sequence of selectors, each of which
selects zero or more children of the input value.</t>
            <t>Selectors of different kinds may be combined within a single child segment.</t>
            <t>For each node in the input nodelist,
the resulting nodelist of a child segment is the concatenation of
the nodelists from each of its selectors in the order that the selectors
appear in the list.
Note: any node matched by more than one selector is kept
as many times in the nodelist.</t>
            <t>Where a selector can produce a nodelist in more than one possible order,
each occurrence of the selector in the child segment
may evaluate to produce a nodelist in a distinct order.</t>
            <t>So a child segment drills down one more level into the structure of the input value.</t>
          </section>
          <section anchor="examples-7">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
["a", "b", "c", "d", "e", "f", "g"]
]]></sourcecode>
            <t>Queries:</t>
            <table anchor="tbl-child-segment">
              <name>Child segment examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$[0, 3]</tt></td>
                  <td align="left">
                    <tt>"a"</tt> <br/> <tt>"d"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt> <br/> <tt>$[3]</tt></td>
                  <td align="left">Indices</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[0:2, 5]</tt></td>
                  <td align="left">
                    <tt>"a"</tt> <br/> <tt>"b"</tt> <br/> <tt>"f"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt> <br/> <tt>$[1]</tt> <br/> <tt>$[5]</tt></td>
                  <td align="left">Slice and index</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$[0, 0]</tt></td>
                  <td align="left">
                    <tt>"a"</tt> <br/> <tt>"a"</tt></td>
                  <td align="center">
                    <tt>$[0]</tt> <br/> <tt>$[0]</tt></td>
                  <td align="left">Duplicated entries</td>
                </tr>
              </tbody>
            </table>
          </section>
        </section>
        <section anchor="descendant-segment">
          <name>Descendant Segment</name>
          <section anchor="syntax-5">
            <name>Syntax</name>
            <t>The descendant segment consists of a double dot <tt>..</tt>
followed by a child segment (using bracket notation).</t>
            <t>Shortand notations are also provided that correspond to the shorthand forms of the child segment.</t>
            <sourcecode type="abnf" name="jsonpath-collected.abnf"><![CDATA[
descendant-segment  = ".." (bracketed-selection /
                            wildcard-selector /
                            member-name-shorthand)
]]></sourcecode>
            <t><tt>..*</tt>, the <tt>descendant-segment</tt> directly built from a
<tt>wildcard-selector</tt>, is shorthand for <tt>..[*]</tt>.</t>
            <t><tt>..&lt;member-name&gt;</tt>, a <tt>descendant-segment</tt> built from a
<tt>member-name-shorthand</tt>, is shorthand for <tt>..['&lt;member-name&gt;']</tt>.
Note: as with the similar shorthand of a <tt>child-segment</tt>, this can
only be used with member names that are composed of certain
characters, as specified in the ABNF rule <tt>member-name-shorthand</tt>.</t>
            <t>Note: <tt>..</tt> on its own is not a valid segment.</t>
          </section>
          <section anchor="semantics-7">
            <name>Semantics</name>
            <t>A descendant segment produces zero or more descendants of an input value.</t>
            <t>For each node in the input nodelist,
a descendant selector visits the input node and each of
its descendants such that:</t>
            <ul spacing="normal">
              <li>nodes of any array are visited in array order, and</li>
              <li>nodes are visited before their descendants.</li>
            </ul>
            <t>The order in which the children of an object are visited is not stipulated, since
JSON objects are unordered.</t>
            <t>Suppose the descendant segment is of the form <tt>..[&lt;selectors&gt;]</tt> (after converting any shorthand
form to bracket notation)
and the nodes, in the order visited, are <tt>D1</tt>, ..., <tt>Dn</tt> (where <tt>n &gt;= 1</tt>).
Note: <tt>D1</tt> is the input value.</t>
            <t>For each <tt>i</tt> such that <tt>1 &lt;= i &lt;= n</tt>, the nodelist <tt>Ri</tt> is defined to be a result of applying
the child segment <tt>[&lt;selectors&gt;]</tt> to the node <tt>Di</tt>.</t>
            <t>For each node in the input nodelist,
the result of the descendant segment is the concatenation of <tt>R1</tt>,
..., <tt>Rn</tt> (in that order).
These results are then concatenated in input nodelist order to form
the result of the segment.</t>
            <t>So a descendant segment drills down one or more levels into the structure of each input value.</t>
          </section>
          <section anchor="examples-8">
            <name>Examples</name>
            <t>JSON:</t>
            <sourcecode type="json"><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3, [{"j": 4}, {"k": 6}]]
}
]]></sourcecode>
            <t>Queries:</t>
            <t>(Note that the fourth example can be expressed in two equivalent
queries, shown here in one table row instead of two almost identical rows.)</t>
            <table anchor="tbl-descendant-segment">
              <name>Descendant segment examples</name>
              <thead>
                <tr>
                  <th align="center">Query</th>
                  <th align="left">Result</th>
                  <th align="center">Result Paths</th>
                  <th align="left">Comment</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="center">
                    <tt>$..j</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>4</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['a'][2][0]['j']</tt></td>
                  <td align="left">Object values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..j</tt></td>
                  <td align="left">
                    <tt>4</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['a'][2][0]['j']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Alternative result</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..[0]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>{"j": 4}</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][2][0]</tt></td>
                  <td align="left">Array values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..[*]</tt> <br/>or<br/> <tt>$..*</tt></td>
                  <td align="left">
                    <tt>{"j": 1, "k": 2}</tt> <br/> <tt>[5, 3, [{"j": 4}, {"k": 6}]]</tt> <br/> <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>5</tt> <br/> <tt>3</tt> <br/> <tt>[{"j": 4}, {"k": 6}]</tt> <br/> <tt>{"j": 4}</tt> <br/> <tt>{"k": 6}</tt> <br/> <tt>4</tt> <br/> <tt>6</tt></td>
                  <td align="center">
                    <tt>$['o']</tt> <br/> <tt>$['a']</tt> <br/> <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt> <br/> <tt>$['a'][2]</tt> <br/> <tt>$['a'][2][0]</tt> <br/> <tt>$['a'][2][1]</tt> <br/> <tt>$['a'][2][0]['j']</tt> <br/> <tt>$['a'][2][1]['k']</tt></td>
                  <td align="left">All values</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$..o</tt></td>
                  <td align="left">
                    <tt>{"j": 1, "k": 2}</tt></td>
                  <td align="center">
                    <tt>$['o']</tt></td>
                  <td align="left">Input value is visited</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.o..[*, *]</tt></td>
                  <td align="left">
                    <tt>1</tt> <br/> <tt>2</tt> <br/> <tt>2</tt> <br/> <tt>1</tt></td>
                  <td align="center">
                    <tt>$['o']['j']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['k']</tt> <br/> <tt>$['o']['j']</tt></td>
                  <td align="left">Non-deterministic ordering</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.a..[0, 1]</tt></td>
                  <td align="left">
                    <tt>5</tt> <br/> <tt>3</tt> <br/> <tt>{"j": 4}</tt> <br/> <tt>{"k": 6}</tt></td>
                  <td align="center">
                    <tt>$['a'][0]</tt> <br/> <tt>$['a'][1]</tt> <br/> <tt>$['a'][2][0]</tt> <br/> <tt>$['a'][2][1]</tt></td>
                  <td align="left">Multiple segments</td>
                </tr>
              </tbody>
            </table>
            <t>Note: the ordering of the results for the <tt>$..[*]</tt> and <tt>$..*</tt> examples above is not guaranteed, except that:</t>
            <ul spacing="normal">
              <li>
                <tt>{"j": 1, "k": 2}</tt> must appear before <tt>1</tt> and <tt>2</tt>,</li>
              <li>
                <tt>[5, 3, [{"j": 4}, {"k": 6}]]</tt> must appear before <tt>5</tt>, <tt>3</tt>, and <tt>[{"j": 4}, {"k": 6}]</tt>,</li>
              <li>
                <tt>5</tt> must appear before <tt>3</tt> which must appear before <tt>[{"j": 4}, {"k": 6}]</tt>,</li>
              <li>
                <tt>5</tt> and <tt>3</tt> must appear before <tt>{"j": 4}</tt>, <tt>4</tt>, <tt>, {"k": 6}</tt>, and <tt>6</tt>,</li>
              <li>
                <tt>[{"j": 4}, {"k": 6}]</tt> must appear before <tt>{"j": 4}</tt> and <tt>{"k": 6}</tt>,</li>
              <li>
                <tt>{"j": 4}</tt> must appear before <tt>{"k": 6}</tt>,</li>
              <li>
                <tt>{"k": 6}</tt> must appear before <tt>4</tt>, and</li>
              <li>
                <tt>4</tt> must appear before <tt>6</tt>.</li>
            </ul>
            <t>The example above with the query <tt>$.o..[*, *]</tt> shows that a selector may produce nodelists in distinct orders
each time it appears in the descendant segment.</t>
            <t>The example above with the query <tt>$.a..[0, 1]</tt> shows that the child segment <tt>[0, 1]</tt> is applied to each node
in turn (rather than the nodes being visited once per selector, which is the case for some JSONPath implementations
that do not conform to this specification).</t>
          </section>
        </section>
      </section>
      <section anchor="null-semantics">
        <name>Semantics of <tt>null</tt></name>
        <t>Note: JSON <tt>null</tt> is treated the same as any other JSON value: it is not taken to mean "undefined" or "missing".</t>
        <section anchor="examples-9">
          <name>Examples</name>
          <t>JSON:</t>
          <sourcecode type="json"><![CDATA[
{"a": null, "b": [null], "c": [{}], "null": 1}
]]></sourcecode>
          <t>Queries:</t>
          <table anchor="tbl-null-examples">
            <name>Examples involving (or not involving) null</name>
            <thead>
              <tr>
                <th align="center">Query</th>
                <th align="left">Result</th>
                <th align="center">Result Paths</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$.a</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['a']</tt></td>
                <td align="left">Object value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.a[0]</tt></td>
                <td align="left"> </td>
                <td align="center"> </td>
                <td align="left">
                  <tt>null</tt> used as array</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.a.d</tt></td>
                <td align="left"> </td>
                <td align="center"> </td>
                <td align="left">
                  <tt>null</tt> used as object</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[0]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Array value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[*]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Array value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[?@]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Existence</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.b[?@==null]</tt></td>
                <td align="left">
                  <tt>null</tt></td>
                <td align="center">
                  <tt>$['b'][0]</tt></td>
                <td align="left">Comparison</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.c[?@.d==null]</tt></td>
                <td align="left"> </td>
                <td align="center"> </td>
                <td align="left">Comparison with "missing" value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.null</tt></td>
                <td align="left">
                  <tt>1</tt></td>
                <td align="center">
                  <tt>$['null']</tt></td>
                <td align="left">Not JSON null at all, just a member name string</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="normalized-paths">
        <name>Normalized Paths</name>
        <t>A Normalized Path is a unique representation of the location of a node in a value which
uniquely identifies the node in the value.
Specifically, a Normalized Path is a JSONPath query with restricted syntax (defined below),
e.g., <tt>$['book'][3]</tt>, which when applied to the value results in a nodelist consisting
of just the node identified by the Normalized Path.
Note: a Normalized Path represents the identity of a node <em>in a specific value</em>.
There is precisely one Normalized Path identifying any particular node in a value.</t>
        <t>A nodelist may be represented compactly in JSON as an array of strings, where the strings are
Normalized Paths.</t>
        <t>Normalized Paths provide a predictable format that simplifies testing and post-processing
of nodelists, e.g., to remove duplicate nodes.
Normalized Paths are used in this document as result paths in examples.</t>
        <t>Normalized Paths use the canonical bracket notation, rather than dot notation.</t>
        <t>Single quotes are used in Normalized Paths to delimit string member names. This reduces the
number of characters that need escaping when Normalized Paths appear in double quote-delimited
strings, e.g., in JSON texts.</t>
        <t>Certain characters are escaped in Normalized Paths, in one and only one way; all other
characters are unescaped.</t>
        <t>Note: Normalized Paths are singular queries, but not all singular queries are Normalized Paths.
For example, <tt>$[-3]</tt> is a singular query, but is not a Normalized Path.
The Normalized Path equivalent to <tt>$[-3]</tt> would have an index equal to the array length minus <tt>3</tt>.
(The array length must be at least <tt>3</tt> if <tt>$[-3]</tt> is to identify a node.)</t>
        <sourcecode type="abnf" name="normalized-path-collected.abnf"><![CDATA[
normalized-path      = root-identifier *(normal-index-segment)
normal-index-segment = "[" normal-selector "]"
normal-selector      = normal-name-selector / normal-index-selector
normal-name-selector = %x27 *normal-single-quoted %x27 ; 'string'
normal-single-quoted = normal-unescaped /
                       ESC normal-escapable
normal-unescaped     =    ; omit %x0-1F control codes
                       %x20-26 /
                          ; omit 0x27 '
                       %x28-5B /
                          ; omit 0x5C \
                       %x5D-10FFFF
normal-escapable     = %x62 / ; b BS backspace U+0008
                       %x66 / ; f FF form feed U+000C
                       %x6E / ; n LF line feed U+000A
                       %x72 / ; r CR carriage return U+000D
                       %x74 / ; t HT horizontal tab U+0009
                       "'" /  ; ' apostrophe U+0027
                       "\" /  ; \ backslash (reverse solidus) U+005C
                       (%x75 normal-hexchar)
                                       ; certain values u00xx U+00XX
normal-hexchar       = "0" "0"
                       (
                          ("0" %x30-37) / ; "00"-"07"
                             ; omit U+0008-U+000A BS HT LF
                          ("0" %x62) /    ; "0b"
                             ; omit U+000C-U+000D FF CR
                          ("0" %x65-66) / ; "0e"-"0f"
                          ("1" normal-HEXDIG)
                        )
normal-HEXDIG        = DIGIT / %x61-66    ; "0"-"9", "a"-"f"
normal-index-selector = "0" / (DIGIT1 *DIGIT)
                        ; non-negative decimal integer
]]></sourcecode>
        <t>Since there can only be one Normalized Path identifying a given node, the syntax
stipulates which characters are escaped and which are not.
So the definition of <tt>normal-hexchar</tt> is designed for hex escaping of characters
which are not straightforwardly printable, for example U+000B LINE TABULATION, but
for which no standard JSON escape, such as <tt>\n</tt>, is available.</t>
        <section anchor="examples-10">
          <name>Examples</name>
          <table anchor="tbl-normalized-path-examples">
            <name>Normalized Path examples</name>
            <thead>
              <tr>
                <th align="center">Path</th>
                <th align="center">Normalized Path</th>
                <th align="left">Comment</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>$.a</tt></td>
                <td align="center">
                  <tt>$['a']</tt></td>
                <td align="left">Object value</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[1]</tt></td>
                <td align="center">
                  <tt>$[1]</tt></td>
                <td align="left">Array index</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$[-3]</tt></td>
                <td align="center">
                  <tt>$[2]</tt></td>
                <td align="left">Negative array index for an array of length 5</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$.a.b[1:2]</tt></td>
                <td align="center">
                  <tt>$['a']['b'][1]</tt></td>
                <td align="left">Nested structure</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$["\u000B"]</tt></td>
                <td align="center">
                  <tt>$['\u000b']</tt></td>
                <td align="left">Unicode escape</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>$["\u0061"]</tt></td>
                <td align="center">
                  <tt>$['a']</tt></td>
                <td align="left">Unicode character</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t><cref anchor="replace-xxxx">RFC Ed.: throughout this section, please replace
RFCXXXX with the RFC number of this specification and remove this
note.</cref></t>
      <section anchor="registration-of-media-type-applicationjsonpath">
        <name>Registration of Media Type application/jsonpath</name>
        <t>IANA is requested to register the following media type <xref target="RFC6838"/>:</t>
        <dl>
          <dt>Type name:</dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>Subtype name:</dt>
          <dd>
            <t>jsonpath</t>
          </dd>
          <dt>Required parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Optional parameters:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Encoding considerations:</dt>
          <dd>
            <t>binary (UTF-8)</t>
          </dd>
          <dt>Security considerations:</dt>
          <dd>
            <t>See the Security Considerations section of RFCXXXX.</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t>RFCXXXX</t>
          </dd>
          <dt>Applications that use this media type:</dt>
          <dd>
            <t>Applications that need to convey queries in JSON data</t>
          </dd>
          <dt>Fragment identifier considerations:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Additional information:</dt>
          <dd>
            <dl>
              <dt>Deprecated alias names for this type:</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Magic number(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>File extension(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
              <dt>Macintosh file type code(s):</dt>
              <dd>
                <t>N/A</t>
              </dd>
            </dl>
          </dd>
        </dl>
        <t>Person &amp; email address to contact for further information:
   iesg@ietf.org</t>
        <dl>
          <dt>Intended usage:</dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>Restrictions on usage:</dt>
          <dd>
            <t>N/A</t>
          </dd>
          <dt>Author:</dt>
          <dd>
            <t>JSONPath WG</t>
          </dd>
          <dt>Change controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Provisional registration? (standards tree only):</dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
      </section>
      <section anchor="iana-fnex">
        <name>Function Extensions</name>
        <t>This specification defines a new "Function Extensions sub-registry" in
a new "JSONPath Parameters registry", with the policy "expert review"
(<xref section="4.5" sectionFormat="of" target="BCP26"/>).</t>
        <t anchor="de-instructions">The experts are instructed to be frugal in the allocation of function
extension names that are suggestive of generally applicable semantics,
keeping them in reserve for functions that are likely to enjoy wide
use and can make good use of their conciseness.
The expert is also instructed to direct the registrant to provide a
specification (<xref section="4.6" sectionFormat="of" target="BCP26"/>), but can make exceptions,
for instance when a specification is not available at the time of
registration but is likely forthcoming.
If the expert becomes aware of function extensions that are deployed and
in use, they may also initiate a registration on their own if
they deem such a registration can avert potential future collisions.</t>
        <t>Each entry in the sub-registry must include:</t>
        <dl newline="true">
          <dt>Function Name:</dt>
          <dd>
            <t>a lower case ASCII <xref target="STD80"/> string that starts with a letter and can
contain letters, digits and underscore characters afterwards
(<tt>[a-z][_a-z0-9]*</tt>). No other entry in the sub-registry can have the
same function name.</t>
          </dd>
          <dt>Brief description:</dt>
          <dd>
            <t>a brief description</t>
          </dd>
          <dt>Parameters:</dt>
          <dd>
            <t>A comma-separated list of zero or more declared types, one for each of the
arguments expected for this function extension</t>
          </dd>
          <dt>Result:</dt>
          <dd>
            <t>The declared type of the result for this function extension</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>(see <xref section="2.3" sectionFormat="of" target="BCP26"/>)</t>
          </dd>
          <dt>Reference:</dt>
          <dd>
            <t>a reference document that provides a description of the function
extension</t>
          </dd>
        </dl>
        <t>Initial entries in this sub-registry are as listed in <xref target="pre-reg"/>; the
entries in the Column "Change Controller" all have the value "IETF"
and the entries in the column
"Reference" all have the value "<xref target="fnex"/> of RFCXXXX":</t>
        <table anchor="pre-reg">
          <name>Initial Entries in the Function Extensions Subregistry</name>
          <thead>
            <tr>
              <th align="left">Function Name</th>
              <th align="left">Brief description</th>
              <th align="left">Parameters</th>
              <th align="left">Result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">length</td>
              <td align="left">length of string, array, object</td>
              <td align="left">
                <tt>ValueType</tt></td>
              <td align="left">
                <tt>ValueType</tt></td>
            </tr>
            <tr>
              <td align="left">count</td>
              <td align="left">size of nodelist</td>
              <td align="left">
                <tt>NodesType</tt></td>
              <td align="left">
                <tt>ValueType</tt></td>
            </tr>
            <tr>
              <td align="left">match</td>
              <td align="left">regular expression full match</td>
              <td align="left">
                <tt>ValueType</tt>, <tt>ValueType</tt></td>
              <td align="left">
                <tt>LogicalType</tt></td>
            </tr>
            <tr>
              <td align="left">search</td>
              <td align="left">regular expression substring match</td>
              <td align="left">
                <tt>ValueType</tt>, <tt>ValueType</tt></td>
              <td align="left">
                <tt>LogicalType</tt></td>
            </tr>
            <tr>
              <td align="left">value</td>
              <td align="left">value of single node in nodelist</td>
              <td align="left">
                <tt>NodesType</tt></td>
              <td align="left">
                <tt>ValueType</tt></td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>Security considerations for JSONPath can stem from</t>
      <ul spacing="normal">
        <li>attack vectors on JSONPath implementations,</li>
        <li>attack vectors on how JSONPath queries are formed, and</li>
        <li>the way JSONPath is used in security-relevant mechanisms.</li>
      </ul>
      <section anchor="attack-vectors-on-jsonpath-implementations">
        <name>Attack Vectors on JSONPath Implementations</name>
        <t>Historically, JSONPath has often been implemented by feeding parts of
the query to an underlying programming language engine, e.g.,
JavaScript's <tt>eval()</tt> function.
This approach is well known to lead to injection attacks and would
require perfect input validation to prevent these attacks (see
<xref section="12" sectionFormat="of" target="RFC8259"/> for similar considerations for JSON itself).
Instead, JSONPath implementations need to implement the entire syntax
of the query without relying on the parsers of programming language
engines.</t>
        <t>Attacks on availability may attempt to trigger unusually expensive
runtime performance exhibited by certain implementations in certain
cases.
(See <xref section="10" sectionFormat="of" target="RFC8949"/> for issues in hash-table implementations,
and <xref section="8" sectionFormat="of" target="I-D.draft-ietf-jsonpath-iregexp"/> for performance issues in regular
expression implementations.)
Implementers need to be aware that good average performance is not
sufficient as long as an attacker can choose to submit specially
crafted JSONPath queries or query arguments that trigger surprisingly high, possibly
exponential, CPU usage or, for example via a naive recursive implementation of the descendant segment,
stack overflow. Implementations need to have appropriate resource management
to mitigate these attacks.</t>
      </section>
      <section anchor="attack-vectors-on-how-jsonpath-queries-are-formed">
        <name>Attack Vectors on How JSONPath Queries are Formed</name>
        <t>JSONPath queries are often not static, but formed from variables that
provide index values, member names, or values to compare with in a
filter expression.
These variables need to be validated (e.g., only allowing specific constructs
such as .name to be formed when the given values allow that) and translated
(e.g., by escaping string delimiters).
Not performing these validations and translations correctly can lead to unexpected
failures, which can lead to Availability, Confidentiality, and
Integrity breaches, in particular if an adversary has control over the
values (e.g., by entering them into a Web form).
The resulting class of attacks, <em>injections</em> (e.g., SQL injections),
is consistently found among the top causes of application security
vulnerabilities and requires particular attention.</t>
      </section>
      <section anchor="attacks-on-security-mechanisms-that-employ-jsonpath">
        <name>Attacks on Security Mechanisms that Employ JSONPath</name>
        <t>Where JSONPath is used as a part of a security mechanism, attackers
can attempt to provoke unexpected or unpredictable behavior, or
take advantage of differences in behavior between JSONPath implementations.</t>
        <t>Unexpected or unpredictable behavior can arise from a query argument with certain
constructs described as unpredictable by <xref target="RFC8259"/>.
Predictable behavior can be expected, except in relation to the ordering
of objects, for any query argument conforming with <xref target="RFC7493"/>.</t>
        <t>Other attacks can target the behavior of underlying technologies such as UTF-8 (see
<xref section="10" sectionFormat="of" target="RFC3629"/>) and the Unicode character set.</t>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="STD80">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf"/>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="BCP26">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC3629">
          <front>
            <title>UTF-8, a transformation format of ISO 10646</title>
            <author fullname="F. Yergeau" initials="F." surname="Yergeau"/>
            <date month="November" year="2003"/>
            <abstract>
              <t>ISO/IEC 10646-1 defines a large character set called the Universal Character Set (UCS) which encompasses most of the world's writing systems. The originally proposed encodings of the UCS, however, were not compatible with many current applications and protocols, and this has led to the development of UTF-8, the object of this memo. UTF-8 has the characteristic of preserving the full US-ASCII range, providing compatibility with file systems, parsers and other software that rely on US-ASCII values but are transparent to other values. This memo obsoletes and replaces RFC 2279.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="63"/>
          <seriesInfo name="RFC" value="3629"/>
          <seriesInfo name="DOI" value="10.17487/RFC3629"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC7493">
          <front>
            <title>The I-JSON Message Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>I-JSON (short for "Internet JSON") is a restricted profile of JSON designed to maximize interoperability and increase confidence that software can process it successfully with predictable results.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7493"/>
          <seriesInfo name="DOI" value="10.17487/RFC7493"/>
        </reference>
        <reference anchor="RFC6838">
          <front>
            <title>Media Type Specifications and Registration Procedures</title>
            <author fullname="N. Freed" initials="N." surname="Freed"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <author fullname="T. Hansen" initials="T." surname="Hansen"/>
            <date month="January" year="2013"/>
            <abstract>
              <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="13"/>
          <seriesInfo name="RFC" value="6838"/>
          <seriesInfo name="DOI" value="10.17487/RFC6838"/>
        </reference>
        <reference anchor="I-D.draft-ietf-jsonpath-iregexp">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Tim Bray" initials="T." surname="Bray">
              <organization>Textuality</organization>
            </author>
            <date day="29" month="June" year="2023"/>
            <abstract>
              <t>   This document specifies I-Regexp, a flavor of regular expressions
   that is limited in scope with the goal of interoperation across many
   different regular-expression libraries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-iregexp-08"/>
        </reference>
        <reference anchor="UNICODE" target="https://www.unicode.org/versions/Unicode14.0.0/UnicodeStandard-14.0.pdf">
          <front>
            <title>The Unicode® Standard: Version 14.0 - Core Specification</title>
            <author>
              <organization>The Unicode Consortium</organization>
            </author>
            <date year="2021" month="September"/>
          </front>
        </reference>
        <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>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="COMPARISON" target="https://cburgmer.github.io/json-path-comparison/">
          <front>
            <title>JSONPath Comparison</title>
            <author initials="C." surname="Burgmer" fullname="Christoph Burgmer">
              <organization>Thoughtworks</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
            <author fullname="K. Zyp" initials="K." surname="Zyp"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="JSONPath-orig" target="https://goessner.net/articles/JsonPath/">
          <front>
            <title>JSONPath — XPath for JSON</title>
            <author initials="S." surname="Gössner" fullname="Stefan Gössner">
              <organization>Fachhochschule Dortmund</organization>
            </author>
            <date year="2007" month="February" day="21"/>
          </front>
        </reference>
        <reference anchor="XPath" target="https://www.w3.org/TR/2010/REC-xpath20-20101214/">
          <front>
            <title>XML Path Language (XPath) 2.0 (Second Edition)</title>
            <author fullname="Anders Berglund" role="editor"/>
            <author fullname="Don Chamberlin" role="editor"/>
            <author fullname="Jerome Simeon" role="editor"/>
            <author fullname="Jonathan Robie" role="editor"/>
            <author fullname="Mary Fernandez" role="editor"/>
            <author fullname="Michael Kay" role="editor"/>
            <author fullname="Scott Boag" role="editor"/>
            <date day="14" month="December" year="2010"/>
          </front>
          <seriesInfo name="W3C REC" value="REC-xpath20-20101214"/>
          <seriesInfo name="W3C" value="REC-xpath20-20101214"/>
        </reference>
        <reference anchor="E4X">
          <front>
            <title>Information technology — ECMAScript for XML (E4X) specification</title>
            <author>
              <organization>ISO</organization>
            </author>
            <date year="2006"/>
          </front>
          <seriesInfo name="ISO/IEC 22537:2006" value=""/>
        </reference>
        <reference anchor="SLICE" target="https://github.com/tc39/proposal-slice-notation">
          <front>
            <title>Slice notation</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262_3rd_edition_december_1999.pdf">
          <front>
            <title>ECMAScript Language Specification, Standard ECMA-262, Third Edition</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="1999" month="December"/>
          </front>
        </reference>
        <reference anchor="RFC8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="BOOLEAN-LAWS" target="https://en.wikipedia.org/wiki/Boolean_algebra#Laws">
          <front>
            <title>Boolean algebra laws</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
    <?line 2290?>

<section anchor="collected-abnf-grammars">
      <name>Collected ABNF grammars</name>
      <t>This appendix collects the ABNF grammar from the ABNF passages used
throughout the document.</t>
      <!-- Update the collected grammar files using `make sourcecode`, which -->
<!-- is currently manual as it creates a little circular dependency. -->
<!-- The filenames of the ::includes are likely to change when -->
<!-- kramdown-rfc-extract-sourcecode handles filenames better. -->

<t><xref target="jsonpath-abnf"/> contains the collected ABNF grammar that defines the
syntax of a JSONPath query.</t>
      <figure anchor="jsonpath-abnf">
        <name>Collected ABNF of JSONPath queries</name>
        <sourcecode type="abnf"><![CDATA[
jsonpath-query      = root-identifier segments
segments            = *(S segment)

B                   = %x20 /    ; Space
                      %x09 /    ; Horizontal tab
                      %x0A /    ; Line feed or New line
                      %x0D      ; Carriage return
S                   = *B        ; optional blank space
root-identifier     = "$"
selector            = name-selector  /
                      wildcard-selector /
                      slice-selector /
                      index-selector /
                      filter-selector
name-selector       = string-literal

string-literal      = %x22 *double-quoted %x22 /     ; "string"
                      %x27 *single-quoted %x27       ; 'string'

double-quoted       = unescaped /
                      %x27      /                    ; '
                      ESC %x22  /                    ; \"
                      ESC escapable

single-quoted       = unescaped /
                      %x22      /                    ; "
                      ESC %x27  /                    ; \'
                      ESC escapable

ESC                 = %x5C                           ; \  backslash

unescaped           = %x20-21 /                      ; see RFC 8259
                         ; omit 0x22 "
                      %x23-26 /
                         ; omit 0x27 '
                      %x28-5B /
                         ; omit 0x5C \
                      %x5D-10FFFF

escapable           = %x62 / ; b BS backspace U+0008
                      %x66 / ; f FF form feed U+000C
                      %x6E / ; n LF line feed U+000A
                      %x72 / ; r CR carriage return U+000D
                      %x74 / ; t HT horizontal tab U+0009
                      "/"  / ; / slash (solidus) U+002F
                      "\"  / ; \ backslash (reverse solidus) U+005C
                      (%x75 hexchar) ;  uXXXX      U+XXXX

hexchar             = non-surrogate /
                      (high-surrogate "\" %x75 low-surrogate)
non-surrogate       = ((DIGIT / "A"/"B"/"C" / "E"/"F") 3HEXDIG) /
                       ("D" %x30-37 2HEXDIG )
high-surrogate      = "D" ("8"/"9"/"A"/"B") 2HEXDIG
low-surrogate       = "D" ("C"/"D"/"E"/"F") 2HEXDIG

HEXDIG              = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
wildcard-selector   = "*"
index-selector      = int                        ; decimal integer

int                 = "0" /
                      (["-"] DIGIT1 *DIGIT)      ; - optional
DIGIT1              = %x31-39                    ; 1-9 non-zero digit
slice-selector      = [start S] ":" S [end S] [":" [S step ]]

start               = int       ; included in selection
end                 = int       ; not included in selection
step                = int       ; default: 1
filter-selector     = "?" S logical-expr
logical-expr        = logical-or-expr
logical-or-expr     = logical-and-expr *(S "||" S logical-and-expr)
                        ; disjunction
                        ; binds less tightly than conjunction
logical-and-expr    = basic-expr *(S "&&" S basic-expr)
                        ; conjunction
                        ; binds more tightly than disjunction

basic-expr          = paren-expr /
                      comparison-expr /
                      test-expr

paren-expr          = [logical-not-op S] "(" S logical-expr S ")"
                                        ; parenthesized expression
logical-not-op      = "!"               ; logical NOT operator
test-expr           = [logical-not-op S]
                     (filter-query / ; existence/non-existence
                      function-expr) ; LogicalType or
                                     ; NodesType
filter-query        = rel-query / jsonpath-query
rel-query           = current-node-identifier segments
current-node-identifier = "@"
comparison-expr     = comparable S comparison-op S comparable
literal             = number / string-literal /
                      true / false / null
comparable          = literal /
                      singular-query / ; singular query value
                      function-expr    ; ValueType
comparison-op       = "==" / "!=" /
                      "<=" / ">=" /
                      "<"  / ">"

singular-query      = rel-singular-query / abs-singular-query
rel-singular-query  = current-node-identifier singular-query-segments
abs-singular-query  = root-identifier singular-query-segments
singular-query-segments = *(S (name-segment / index-segment))
name-segment        = ("[" name-selector "]") /
                      ("." member-name-shorthand)
index-segment       = "[" index-selector "]"
number              = (int / "-0") [ frac ] [ exp ] ; decimal number
frac                = "." 1*DIGIT                  ; decimal fraction
exp                 = "e" [ "-" / "+" ] 1*DIGIT    ; decimal exponent
true                = %x74.72.75.65                ; true
false               = %x66.61.6c.73.65             ; false
null                = %x6e.75.6c.6c                ; null
function-name       = function-name-first *function-name-char
function-name-first = LCALPHA
function-name-char  = function-name-first / "_" / DIGIT
LCALPHA             = %x61-7A  ; "a".."z"

function-expr       = function-name "(" S [function-argument
                         *(S "," S function-argument)] S ")"
function-argument   = literal /
                      filter-query / ; (includes singular-query)
                      logical-expr /
                      function-expr
segment             = child-segment / descendant-segment
child-segment       = bracketed-selection /
                      ("."
                       (wildcard-selector /
                        member-name-shorthand))

bracketed-selection = "[" S selector *(S "," S selector) S "]"

member-name-shorthand = name-first *name-char
name-first          = ALPHA /
                      "_"   /
                      %x80-10FFFF   ; any non-ASCII Unicode character
name-char           = DIGIT / name-first

DIGIT               = %x30-39              ; 0-9
ALPHA               = %x41-5A / %x61-7A    ; A-Z / a-z
descendant-segment  = ".." (bracketed-selection /
                            wildcard-selector /
                            member-name-shorthand)
]]></sourcecode>
      </figure>
      <t><xref target="normalized-path-abnf"/> contains the collected ABNF grammar that
defines the syntax of a JSONPath Normalized Path, while also using the rules
<tt>root-identifier</tt>, <tt>ESC</tt>, <tt>DIGIT</tt>, and <tt>DIGIT1</tt> from <xref target="jsonpath-abnf"/>.</t>
      <figure anchor="normalized-path-abnf">
        <name>Collected ABNF of JSONPath Normalized Paths</name>
        <sourcecode type="abnf"><![CDATA[
normalized-path      = root-identifier *(normal-index-segment)
normal-index-segment = "[" normal-selector "]"
normal-selector      = normal-name-selector / normal-index-selector
normal-name-selector = %x27 *normal-single-quoted %x27 ; 'string'
normal-single-quoted = normal-unescaped /
                       ESC normal-escapable
normal-unescaped     =    ; omit %x0-1F control codes
                       %x20-26 /
                          ; omit 0x27 '
                       %x28-5B /
                          ; omit 0x5C \
                       %x5D-10FFFF
normal-escapable     = %x62 / ; b BS backspace U+0008
                       %x66 / ; f FF form feed U+000C
                       %x6E / ; n LF line feed U+000A
                       %x72 / ; r CR carriage return U+000D
                       %x74 / ; t HT horizontal tab U+0009
                       "'" /  ; ' apostrophe U+0027
                       "\" /  ; \ backslash (reverse solidus) U+005C
                       (%x75 normal-hexchar)
                                       ; certain values u00xx U+00XX
normal-hexchar       = "0" "0"
                       (
                          ("0" %x30-37) / ; "00"-"07"
                             ; omit U+0008-U+000A BS HT LF
                          ("0" %x62) /    ; "0b"
                             ; omit U+000C-U+000D FF CR
                          ("0" %x65-66) / ; "0e"-"0f"
                          ("1" normal-HEXDIG)
                        )
normal-HEXDIG        = DIGIT / %x61-66    ; "0"-"9", "a"-"f"
normal-index-selector = "0" / (DIGIT1 *DIGIT)
                        ; non-negative decimal integer
]]></sourcecode>
      </figure>
    </section>
    <section anchor="inspired-by-xpath">
      <name>Inspired by XPath</name>
      <t>This appendix is informative.</t>
      <t>At the time JSONPath was invented, XML was noted for the availability of
powerful tools to analyze, transform and selectively extract data from
XML documents.
<xref target="XPath"/> is one of these tools.</t>
      <t>In 2007, the need for something solving the same class of problems for
the emerging JSON community became apparent, specifically for:</t>
      <ul spacing="normal">
        <li>Finding data interactively and extracting them out of <xref target="RFC8259"/>
JSON values without special scripting.</li>
        <li>Specifying the relevant parts of the JSON data in a request by a
client, so the server can reduce the amount of data in its response,
minimizing bandwidth usage.</li>
      </ul>
      <t>(Note: XPath has evolved since 2007, and recent versions even
nominally support operating inside JSON values.
This appendix only discusses the more widely used version of XPath
that was available in 2007.)</t>
      <t>JSONPath picks up the overall feeling of XPath, but maps the concepts
to syntax (and partially semantics) that would be familiar to someone
using JSON in a dynamic language.</t>
      <t>E.g., in popular dynamic programming languages such as JavaScript,
Python and PHP, the semantics of the XPath expression</t>
      <sourcecode type="xpath"><![CDATA[
/store/book[1]/title
]]></sourcecode>
      <t>can be realized in the expression</t>
      <sourcecode type="xpath"><![CDATA[
x.store.book[0].title
]]></sourcecode>
      <t>or, in bracket notation,</t>
      <sourcecode type="xpath"><![CDATA[
x['store']['book'][0]['title']
]]></sourcecode>
      <t>with the variable x holding the query argument.</t>
      <t>The JSONPath language was designed to:</t>
      <ul spacing="normal">
        <li>be naturally based on those language characteristics;</li>
        <li>cover only the most essential parts of XPath 1.0;</li>
        <li>be lightweight in code size and memory consumption;</li>
        <li>be runtime efficient.</li>
      </ul>
      <section anchor="xpath-overview">
        <name>JSONPath and XPath</name>
        <t>JSONPath expressions apply to JSON values in the same way
as XPath expressions are used in combination with an XML document.
JSONPath uses <tt>$</tt> to refer to the root node of the query argument, similar
to XPath's <tt>/</tt> at the front.</t>
        <t>JSONPath expressions move further down the hierarchy using <em>dot notation</em>
(<tt>$.store.book[0].title</tt>)
or the <em>bracket notation</em>
(<tt>$['store']['book'][0]['title']</tt>), a lightweight/limited, and a more
heavyweight syntax replacing XPath's <tt>/</tt> within query expressions.</t>
        <t>Both JSONPath and XPath use <tt>*</tt> for a wildcard.
The descendant operators, starting with <tt>..</tt>, borrowed from <xref target="E4X"/>, are similar to XPath's <tt>//</tt>.
The array slicing construct <tt>[start:end:step]</tt> is unique to JSONPath,
inspired by <xref target="SLICE"/> from ECMASCRIPT 4.</t>
        <t>Filter expressions are supported via the syntax <tt>?&lt;logical-expr&gt;</tt> as in</t>
        <sourcecode type="JSONPath"><![CDATA[
$.store.book[?@.price < 10].title
]]></sourcecode>
        <t><xref target="tbl-xpath-overview"/> extends <xref target="tbl-overview"/> by providing a comparison
with similar XPath concepts.</t>
        <table anchor="tbl-xpath-overview">
          <name>XPath syntax compared to JSONPath</name>
          <thead>
            <tr>
              <th align="left">XPath</th>
              <th align="left">JSONPath</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>/</tt></td>
              <td align="left">
                <tt>$</tt></td>
              <td align="left">the root XML element</td>
            </tr>
            <tr>
              <td align="left">
                <tt>.</tt></td>
              <td align="left">
                <tt>@</tt></td>
              <td align="left">the current XML element</td>
            </tr>
            <tr>
              <td align="left">
                <tt>/</tt></td>
              <td align="left">
                <tt>.</tt> or <tt>[]</tt></td>
              <td align="left">child operator</td>
            </tr>
            <tr>
              <td align="left">
                <tt>..</tt></td>
              <td align="left">n/a</td>
              <td align="left">parent operator</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//</tt></td>
              <td align="left">
                <tt>..name</tt>, <tt>..[index]</tt>, <tt>..*</tt>, or <tt>..[*]</tt></td>
              <td align="left">descendants (JSONPath borrows this syntax from E4X)</td>
            </tr>
            <tr>
              <td align="left">
                <tt>*</tt></td>
              <td align="left">
                <tt>*</tt></td>
              <td align="left">wildcard: All XML elements regardless of their names</td>
            </tr>
            <tr>
              <td align="left">
                <tt>@</tt></td>
              <td align="left">n/a</td>
              <td align="left">attribute access: JSON values do not have attributes</td>
            </tr>
            <tr>
              <td align="left">
                <tt>[]</tt></td>
              <td align="left">
                <tt>[]</tt></td>
              <td align="left">subscript operator used to iterate over XML element collections and for predicates</td>
            </tr>
            <tr>
              <td align="left">
                <tt>|</tt></td>
              <td align="left">
                <tt>[,]</tt></td>
              <td align="left">Union operator (results in a combination of node sets); called list operator in JSONPath, allows combining member names, array indices, and slices</td>
            </tr>
            <tr>
              <td align="left">n/a</td>
              <td align="left">
                <tt>[start:end:step]</tt></td>
              <td align="left">array slice operator borrowed from ES4</td>
            </tr>
            <tr>
              <td align="left">
                <tt>[]</tt></td>
              <td align="left">
                <tt>?</tt></td>
              <td align="left">applies a filter (script) expression</td>
            </tr>
            <tr>
              <td align="left">seamless</td>
              <td align="left">n/a</td>
              <td align="left">expression engine</td>
            </tr>
            <tr>
              <td align="left">
                <tt>()</tt></td>
              <td align="left">n/a</td>
              <td align="left">grouping</td>
            </tr>
          </tbody>
        </table>
        <!-- Note: the weirdness about the vertical bar above is intentional -->

<t>For further illustration, <xref target="tbl-xpath-equivalents"/> shows some XPath expressions
and their JSONPath equivalents.</t>
        <table anchor="tbl-xpath-equivalents">
          <name>Example XPath expressions and their JSONPath equivalents</name>
          <thead>
            <tr>
              <th align="left">XPath</th>
              <th align="left">JSONPath</th>
              <th align="left">Result</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>/store/book/author</tt></td>
              <td align="left">
                <tt>$.store.book[*].author</tt></td>
              <td align="left">the authors of all books in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//author</tt></td>
              <td align="left">
                <tt>$..author</tt></td>
              <td align="left">all authors</td>
            </tr>
            <tr>
              <td align="left">
                <tt>/store/*</tt></td>
              <td align="left">
                <tt>$.store.*</tt></td>
              <td align="left">all things in store, which are some books and a red bicycle</td>
            </tr>
            <tr>
              <td align="left">
                <tt>/store//price</tt></td>
              <td align="left">
                <tt>$.store..price</tt></td>
              <td align="left">the prices of everything in the store</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[3]</tt></td>
              <td align="left">
                <tt>$..book[2]</tt></td>
              <td align="left">the third book</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[last()]</tt></td>
              <td align="left">
                <tt>$..book[-1]</tt></td>
              <td align="left">the last book in order</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[position()&lt;3]</tt></td>
              <td align="left">
                <tt>$..book[0,1]</tt><br/><tt>$..book[:2]</tt></td>
              <td align="left">the first two books</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[isbn]</tt></td>
              <td align="left">
                <tt>$..book[?@.isbn]</tt></td>
              <td align="left">filter all books with isbn number</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//book[price&lt;10]</tt></td>
              <td align="left">
                <tt>$..book[?@.price&lt;10]</tt></td>
              <td align="left">filter all books cheaper than 10</td>
            </tr>
            <tr>
              <td align="left">
                <tt>//*</tt></td>
              <td align="left">
                <tt>$..*</tt></td>
              <td align="left">all elements in XML document; all member values and array elements contained in input value</td>
            </tr>
          </tbody>
        </table>
        <t>XPath has a lot more functionality (location paths in unabbreviated syntax,
operators and functions) than listed in this comparison.  Moreover, there are
significant differences in how the subscript operator works in XPath and
JSONPath:</t>
        <ul spacing="normal">
          <li>Square brackets in XPath expressions always operate on the <em>node
set</em> resulting from the previous path fragment. Indices always start
at 1.</li>
          <li>With JSONPath, square brackets operate on each of the nodes in the <em>nodelist</em>
resulting from the previous query segment. Array indices always start
at 0.</li>
        </ul>
      </section>
    </section>
    <section anchor="json-pointer">
      <name>JSON Pointer</name>
      <t>This appendix is informative.</t>
      <t>JSONPath is not intended as a replacement for, but as a more powerful
companion to, JSON Pointer <xref target="RFC6901"/>. The purposes of the two standards
are different.</t>
      <t>JSON Pointer is for identifying a single value within a JSON value whose
structure is known.</t>
      <t>JSONPath can identify a single value within a JSON value, for example by
using a Normalized Path. But JSONPath is also a query syntax that can be used
to search for and extract multiple values from JSON values whose structure
is known only in a general way.</t>
      <t>A Normalized JSONPath can be converted into a JSON Pointer by converting the syntax,
without knowledge of any JSON value. The inverse is not generally true: a numeric
reference token (path component) in a JSON Pointer may identify a member value of an object or an element of an array.
For conversion to a JSONPath query, knowledge of the structure of the JSON value is
needed to distinguish these cases.</t>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>This document is based on <contact fullname="Stefan Gössner"/>'s
original online article defining JSONPath <xref target="JSONPath-orig"/>.</t>
      <t>The books example was taken from
http://coli.lili.uni-bielefeld.de/~andreas/Seminare/sommer02/books.xml
— a dead link now.</t>
      <t>This work is indebted to Christoph Burgmer for the superb
JSONPath comparison project <xref target="COMPARISON"/> detailing the behavior of over forty JSONPath
implementations applied to numerous queries.</t>
      <!--  LocalWords:  JSONPath XPath nodelist memoization
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="M." surname="Mikulicic" fullname="Marko Mikulicic">
        <organization>InfluxData, Inc.</organization>
        <address>
          <postal>
            <city>Pisa</city>
            <country>IT</country>
          </postal>
          <email>mmikulicic@gmail.com</email>
        </address>
      </contact>
      <contact initials="E." surname="Surov" fullname="Edward Surov">
        <organization>TheSoul Publishing Ltd.</organization>
        <address>
          <postal>
            <city>Limassol</city>
            <country>Cyprus</country>
          </postal>
          <email>esurov.tsp@gmail.com</email>
        </address>
      </contact>
      <contact initials="G." surname="Dennis" fullname="Greg Dennis">
        <organization/>
        <address>
          <postal>
            <city>Auckland</city>
            <country>New Zealand</country>
          </postal>
          <email>gregsdennis@yahoo.com</email>
          <uri>https://github.com/gregsdennis</uri>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
xLoJYvSaAMEfhVYD+2ED9GzEIZOCXtc2nZVx2A09PfiYUc/5GGZNieJj0+ex
Doaib3utmIdRJF+Ugo3pHvmve/luaBUgsB6sQTQeUniJFLdLQ5C1HOTVkpiF
/hANOqtI89jDDfs0AViRO2FmI9/rIE4tJEZOf1tS/KsyGX9ICUlHJtA3B+e2
Nr50QWKzv5F9hVxIluYug1fgGYA6TkrKvUkm4V5yTS9yfoBrMwMCRzqRIOLI
8K4KUd5mVd41QLhg5G3N6JYw5ytKNUHDgc6PHH9z5us2yiwarb/vKNXYMEb4
9+z8nXm/99SjSTbObw18/yvmYml7+6dP99f662vP4aPRkt9E4do52j04sJdK
LgC55zngQcBxuG97UCvVFO8bnQY21/qbD8LHD/Va/4Gq+xhwhTvr/S0YnvM3
wAo7/X/D6Pz9v0fLbQiHjB6ZxPjEM3TmtaMlHGCNcd+wRgOYu6RSbiaQiIfv
Vt/jUU8PB4+8+XrS2JHfPtRonF/qRMed3Aoav4VdSiAJvjPP+fzuJ7MyIZQ5
Eh+rFMo0SF0ntsLKxbEnMUkcm9wOSpHo0fqmDWa801lWUfKt4TcYeXUAcvOw
YUjfvLsFb9ENFQqgI2p3RBvzwn894HcmGqsftXqnztSsUqCJbdncH7wbKRMP
NvCm8iMt1zeSI8sCUWiLEiTKoR7QOyL2bAL8GxVF7E9Yk6zq0knP01xzSE2b
qjgOO2FUGE7+EeNf/warYtLzE146rh4IS1a8se+jqNLusm3bBlW2ivvRuaTC
OiG69NObV/oDbNXoQHWK1fDc2XCJh2FbSRliKyKFG5dOTzCAmmFPoaNZj621
yECwNBThD6vR2ZMsbk0eZLZ5b+rYZS/mzpBAitq8TEoyZJtgol8EkMBlrzCS
bEVnyl60zWT3z8xV/0/NKb/W0yapPKY1jzOt+z7PXO4gn6AToK2/vdHTW/UW
vHTp06bGfK/yLS/9eRLnlQcA1+rNJ01tcrk9E8Z0AlLQQmJd2JhFgUhiwhYF
1BDnUN9zcma78NaQgDyU4CbFEkl+ArxzOBgMFdtkmdDfIT12OTyniCZWRlsx
ktt1gpvE+zXGi9a/0mfuzrEoZnpOfqvLxpwNZNCBjeALpDj+fIm4hp+WzDSx
uEDyAqlX6+C2iA2qRWyIt7/BQAQH+NYgODT1F3Zzc+EBumoVHyRLJM8h55n1
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

-->

</rfc>
