<?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.0.6) -->
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-jsonpath-base-18" 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-18"/>
    <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 must 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 does not fit in the
range of exact values, interfering with the correct interpretation of
the query, 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>
          <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="selectors-1">
        <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']['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">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">Named value in nested object</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.
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</td>
                  <td align="center">
                    <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 primitive values, it selects nothing.</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 are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>$.obj &lt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Objects and arrays are not ordered</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 are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt;= $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &gt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</td>
                </tr>
                <tr>
                  <td align="center">
                    <tt>1 &lt; $.arr</tt></td>
                  <td align="center">false</td>
                  <td align="center">Arrays are not ordered</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 are not ordered</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>
            <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/> <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 translated into the form they take in a
JSONPath query, e.g., by escaping string delimiters, or by only
allowing specific constructs such as <tt>.name</tt> to be formed when the
given values allow that.
Failure to perform these 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="http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.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 2270?>

<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:
H4sIAAAAAAAAA+y923YbSZIg+O5f4YmsKoIsACJIURfqkqJ4qWSvRKlFZWf2
MDWJABAkIwVGoCIAUSxKe/Yj5n3mYc487uN+QPef7BfsJ6zd/BoRFJVZ1b0P
i5NJARF+MTc3Nzc3t0u/31cftvWmUtNikicX6baelsnpop+li9P+r1WRz5PF
eX+cVGl/+EBNksW2rhZTNSnyKs2rZbWtVxblMl1R1XJ8kVVVVuSLqzk0c7j/
9kCpWZKfbes0V/NsW2m9KCa2Av2apvPFOTy6i7+rq4syPa28ElVRLqJHk+Li
Is0X8AifqEW2mEFvnX86fnX0OsG2/nmZllc6/TgvUwKn0qdFqfF9RyXjcZnC
eE1plZRpsq133rxVl2fusf7xL+r9Jf9W02QBHWysbwCSkuXivCi3VR8AKQvs
OJ1mi6KEn4y840V6muT6L//+f1VVnuLzooSGD5LJ+XkxOa8m58tZqvdgWBfL
fIrDyRZX28GDYgrt7PXv3h1uPkQUAAJSwPpxkeeA8UWZ/Pt/T/XDe1R0mS9K
qP6XtLxI8it4lF4k2QynCMEYnBUpgfHs9Lw/lS4G07Qd/L/MrnJ9VJQXWX62
KHID/sqKBwj9YLB/zPLJeQqdYQtlegbYNu9pFPJVoPzhf4Nf8/MiN28E2DPo
dJDbTp+d4eMBzHM7nLtJCb3m+nmBA7dw/pBnH9Kyyhb//j8X+nmZAqHot//l
0AP+dVEtTmEy9Obm+t2763YkXNhD/8aDza2HzTiWIfz57sP+3Y1hf2P4oH9v
8+HG0I1okoyLZ4u/ZQOASuFaWZTZeLkwlMNjeJmU7wv9Mnu/nGWTbGLGcJif
zpYf95JF0oPvk4EF8XVWJT5Ah29dhxcXppkIe9zV/vQyKaf6eFkWH0w/b8/T
42I506+X41lWnQPu9YvF1HX3IrtIqqqY+V3uXs3LZeW6TStscbCo5o3d/gVI
Qu+leZ5Vttmd5eQ9MIWp3+xReqn/S5rIY0MVULmaUuVnV8l5UVDjWi/LbFuf
LxbzavvOnbNscb4c45s7XnmlsvwUKWMB5IBsZ/fVy9c7bw5hNeMvYDxJeYbU
YJqZjJfl2UVaDqS9rLiDrK9PvA8anydlBr/vcGXmOJZX7Nr39NqwCE0fIddz
eL8o5uf6OXckb2UiiuXZ+eKyKN9X6lut3xzsbm5tbcAiTifIZhU9uvdwfbit
50WW82preGQg6hdldtY8UMMQBnm6uJOUi2wyS6s7/wSwY8Xm8f3f/8d/0z/R
N8NHW8dZ5352lO0cUGvDYdfv99c3+rSQfmJe/uPm7uDN/m7/I87Exnp/Y324
PtwY3oUS+3d/2vbhfSq9HZqpL3K9SCfneTErzq5oFPu7L3eOJ2U2X9BQfnr5
QnehmVVdzdNJdppNqFZtdH1ZmMev6GeVlllaIYWZwcObO4f7u3pjY2vz/jaM
4144LPx5/OJwd79lUhwRLyabD+/My2JeVMmsX8GKTvt5sXBwyWCP8Y323uDQ
+hv3Nuo9QAeXl5eDdHKR9IlScqqTzJA53Znj6udxV3dOM6QGaur4bX/nze73
d0y7vT9urG+WU/iLnBhK44O9dJJejNMSvg4fPnw4mE9PfSA9dL8AMWCZnKX6
2Md0DwgG1jyyJtsPLIcMf3MvbXOxD6OBmfZG42EcYekPN3iRPHh49yEw5DFt
Hs9fvXqxv3PUf7Hz43HzXKT54DJ7n81hlAkhCH/deV7AJpTkvySzs3RcJt++
SC4rf6TyXst7PcP3KvdZ0PHbvQfrMoZtnVSTLKMfT7YRyg3ciZ7vvt64Z4tk
SZ7I8jelHgw37vGoNu9twKiWi9MH/HtrY/MutDrOT2XUG1vw/lfmSfD7/t2H
m9Bk3z2592DzAewbOM4+CmxVH/gnvDrs7w2aJMAMXoNMBY3wFyj6w9Hh7qu9
FqJGmlvmGW6nhEfal5HIfuCHw7uD9cG6+WXooE+PIzoyKxt2LC3l/+3/tKRj
FuG/cAcaWwAy2S3KiNraaMlrFmrlKHJmy4tgBcMuv/6QnjBvMX2+3jv4+41Y
fUjzJdHKWVks58yBNUmpWvOeaGbjGc4NCRdQmLgHzAtO1+WZnbE7bXK8UoPB
QPX7faAXFCcnC6Uss5+mp1meVjpBiQllguoqXyQfiV9W6SydLPAhgA4CNtXF
nwRoF4hKI92t6g/JbJlW6rQsLqAhekuPBoq6vcim0xmA8fgb+MEdQot658Ue
nAh0lV3MZ9nplR6ns+JS9/tP1fX2Ms+XyGnS6bY23550TpNZlXbwGPGkk36c
zJbTtPOZm11W0Galr2GR2KqfqTFoDdcJbK/FspykOBd93L2edCyWJsUMR5pO
B1gSmuQq+byhEi3yWfa3dNpvrsvwsPyaJTMNZySYZT0rFpUuTvE4MycOnE41
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
/23vWnfbRq7wfz4FVw0QSZUpOZt1UF9yqeFtDSRdY73AGjAMkJLomCglqqRk
R5G92IfoM/QR+gDtm/RJOuc7Z4YzJOVLukn6w8Rik4jk8Mz9zMz5vu+bVi0J
rXz8lx9+8hH5R162yY71aFMemk1t22IimM5iDdrtg7JY/2udz28TotMMZuu6
QkL4XoVjjjw9xx6TnTxOjYnuEtQrb9n5l8U9iMwbV6brHlAl/7rlVduSJGo0
nlXtW49Q+Vo3PWctY0yS0Np+ZQW0vp3mCzWx++ekwUPYqEWaepYFVsp3paSB
bVYtV7Q/sOl6nyrm6jLH0J5bCtqg1t4eJtBv9tbPZK1dfublrc/Ax2q9bHle
JRPyJar9WvaiYVH50Wt47rZW4jy5YRpNPeHG3Y81b6/5XTZE2rJc1rTmLu6u
4zm3TUm3AbxzFtqts9Z6h4zouNfxMrqYPlOXp63qBgCAfdyanWuPuMbI9tbG
QNlw6p/n0chXjgENd+rP0gPitz3c96uJkImb3Sbyat/2ouhlCcCszfiUSqyc
EWUJGtnvW+rzVpplKvrwzkN3q6VC64rgxbPgxXfB1nd1W+glj3to/c2trWBr
M9gaBS++rb68w93aA+9A06sxvjhS/9U/ipHA9ErwE+g3nV81ebn7I1jMm57b
89/ugwDcq7+wLu0+uM377I968n49N0wavkPooyBofVS9uTao1M2XSffU/Ki3
ztdPKiXLe+2lzpnM2LU7/n2G0No02a6pgPPNdV6S4zus/YpdKp8uf/DI2v/I
2n83a///KzcwotqcIw3D8uweZWTntTgOimNbrarQqwcei3jWsYjfeCxSwW7h
dCkVDmc+gUIE7oJwd2HFPaCwwYPjffoDNa2Jv3jFHvL5WO1Mxz6DeUTwPyL4
HxH8jwj+husRwX/Htx4R/NWyuQvBj+m4aUa9x6xcZd+RMPPDaTED2na49E84
oMmNHoFqtcAlL8F5ZUG9TOpXUL69RHB1zz959xa/TLMSPRO7sbnZuTcjPNP5
gqh3srTgoOsoXX4kGBcFy7FMHVTC4PdcxgjZRUwGwKwc0E4f09EpBMNaIRvK
xyDe9KnG4CAIVX0GaF3/2WDwQsjGY7GQuBwhY0uDw6X2GwBTMnFsszxTw/UE
cdEIF48ncf6enkWQNIGQFlNE3cUjkDDOeKexV8LnUobAgX/1e9VgEKZIeaFq
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
Sz4yCz9WzP8Fk9U7cEuoAQA=

-->

</rfc>
