<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.39 (Ruby 3.2.1) -->
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-jsonpath-base-17" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocDepth="4" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.5 -->
  <front>
    <title abbrev="JSONPath">JSONPath: Query expressions for JSON</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-17"/>
    <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" month="August" day="10"/>
    <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>IESG</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:
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
96LergIKqz0RMCPT2+VzDQqwtdG1X+y59q4FTul6o+Fp/PErPAA9UvMKIadP
wlotyoWKVrdYIu6++AMxgxASha/D2mvWaNjE9xUldVozYIL4U0ProH5kWHm9
1Hxh6VwxieSLKN/7Ue21ODB8bTm5Nak5IS7ipXrgp8JJ+Iz/0WWKeeF/q2bh
8Hy1zXrBq3khcAO8GvKK+vyk85vXoRtCFP6zIp/ej7bBt2INXeDfEJ5cXGjN
NtFEcL/5AzFfs5iNIyKaz/NEnR/UhjYiSOdtR30SFgIOR9Rffi4xTxlFzp5Y
RkwK4sfiX45daGwUL0zn3zkfj5wlQswDvF0KxR/HDUWfWAmI+a9/hD7L2asK
CjQ5OuZpGdsOxLmtWwrOAkXnFJ0dnw74Bn5Ep07KcKseBwsWkkcVc7pXQu4R
LSirYPD8Y4pQ7vrrJuXk2tJk4rJsVy06OH7+Ke314LbVQ+BVWHstEPIU1CPR
oW0eER0b7OGzPwI6McHsXTurLIk43PzzC9bwoEkJTWCdmO/zbIG416/xlDCL
rmap7yRZF5Q1XEKEx7YGTTeRCL4q+Y/USSMfEy4WMcNIBBq4DQEHT4GbmuOI
rs2mEs+DEKzvbZy3NF1oGKeeb6u/JTp4QehJ4JYBm0vtVKmRZxILUcNKbam7
9ZZp0n/XtWIFOubBnbBWYX2IJvs/ar2sEJQXOP0IiHihz9qrfUzpngXly1pb
4CoRrznGV+28lKq8B6CMbmkLUkuasmeKtLUFV76lYrUUD37stqjoFVZb1DWO
RilwMY3aI1nPQtDFqOXG4fM6TqLJaDkiw6ItRR/nwrDM2UgRuG+apAAiR46N
iJgg1WRc8m35A3oEHf+tu9lyj+DNs5q+0CiFKjYfo8Z3NN1tUqRRMW93LEI3
I8XG5h1isBSUAQtBFAvg43y4FLOsAMBmu7OrMXhFikFPiUEEdOaXbbd5WAp2
o5lfZTICPqktkmI4tfK2pHj1Oqi8rLWF7OHlDGXwB5XKb3JLvKUtaHDtbg6k
MFeKysu7pRhdxNFMM4RsDu7TFk1T8VqT693j4ZlqDgeJe9/IjBui62ncCJqv
UNpMKvGLsVlfNZyzu8taW1CF8qjpYvTWLYz239LiQjiDc7Z8aBc4AEv4bYO4
aWhcFtNoOCSIz6gkFep55qKOtXWNl9nhzihx4phV21wqBb7/TpVK6kNPgMmJ
BIfuxGE5I9ZaF9TgAqgbcdOh4irLebc40ZeN5hoWd+vHf1vQ4inXpdaXTrOl
V9GykExjjUvUBaGcTxp/1wK7MLH0hMCUZIsCzUSesUx45x+yTq9zhQJPcINz
f5MsdD8n1u1ozy8qAlpCWHCFQl+XWJJR+3ZVvrdJxrezmoqvxARfI9+A7vT5
PHmUwU55p5HYhsPgACGB1MUIE3xqnO7OyRZDhi+8wbjThmH2aJ8yqEPPEUBw
pv8w2Ly5CRD4P1vkRKJtjEy0KBoMXQ+AoTJ69J28ySthoCsX5l5g4YSki2+1
I+tQrbZgVZxXApqrXIDmZdeeLFYWA8xdebogRcOlGO3qjDf+HxdzB3IE7m4a
hEN0bdgExWbGkA6ZxtljHAxjYvYnms5UViYMGce4DKuTqaynK8tmJlRDQHXJ
PBNUiNKc9hjGmqlc4/xEbtcOlzaVeXkd3vO0iZuKVsdsRjohb89SVB4M5IpA
fj6aBNXg/ZKTOKFkqr0pVnuKV6JlzjNiQ2zP+C57wp7oHb/sIS0eoYpZfWov
6S4xPAPm61sMfoXlnomPuI6FQJZUgR56biXnVS5uY6/XFL4eeTJopGDQfC2S
4kJcHwSaTM3iNyOTL0dCrLZlo47Hey14wrc0eLQBEFV/N/bH1Wp1PI/PVV3+
9O9/FoVq2Jubm6eFl+XJe7K+04iggzJAdlLN6iCmZzYErvRfNygRHCqp03jn
1qOfLKLMUAkvj4v5fLbd74+yNAnSRP1vMU02holq3fM4HQfjuP+LGtB5HBX9
45jcAJTCWxCVQj54BgWjCD5MUu8/v/4dAKgR3dFM/6pGx1UgtaUtgxeycTwU
zOX9C7KrZrMLNeFytVrmxpmlWKgFeWjN9JIBcZZn6P/Vav+Hd0dvfjxU36hD
5jhWO3uqh7SNG4MbL8JFtmCFqjhzFvEexq5exhP0K47P/lu1Qac/K2W02PbL
5uZ9reSpiydZ8pFR+HFi/i9UB6p/UagBAA==

-->

</rfc>
