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

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

<!-- 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 section is informative.</t>
        <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>This section is informative.</t>
        <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[-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.</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"><![CDATA[
jsonpath-query      = root-identifier segments
segments            = *(S segment)
]]></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.</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 numbered="false" toc="exclude" 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"><![CDATA[
root-identifier     = "$"
]]></sourcecode>
        </section>
        <section numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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"><![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 numbered="false" toc="exclude" 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"><![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>Note: <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).</t>
          </section>
          <section numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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 numbered="false" toc="exclude" anchor="syntax-2">
            <name>Syntax</name>
            <t>The wildcard selector consists of an asterisk.</t>
            <sourcecode type="abnf"><![CDATA[
wildcard-selector   = "*"
]]></sourcecode>
          </section>
          <section numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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"><![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"><![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

B                   = %x20 /    ; Space
                      %x09 /    ; Horizontal tab
                      %x0A /    ; Line feed or New line
                      %x0D      ; Carriage return
S                   = *B        ; optional blank space

]]></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 numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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"><![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>
            <sourcecode type="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"><![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"><![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).
Alphabetic characters in ABNF are case-insensitive, so within a
floating point number the ABNF expression "e" can be either the value
'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"><![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 <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 <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[?@&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
must 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"><![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>
              <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 Nothing.</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 <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 <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 <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"><![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 numbered="false" toc="exclude" 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"><![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 numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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"><![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 numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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"><![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 numbered="false" toc="exclude" 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>
      <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
Column "Change Controller" always has the value "IESG" and the column
"Reference" always has the value "<xref target="fnex"/> of RFCthis":</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="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 2232?>

<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>
      <!--  LocalWords:  JSONPath XPath nodelist memoization
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="M." surname="Mikulicic" fullname="Marko Mikulicic">
        <organization>InfluxData, Inc.</organization>
        <address>
          <postal>
            <city>Pisa</city>
            <country>IT</country>
          </postal>
          <email>mmikulicic@gmail.com</email>
        </address>
      </contact>
      <contact initials="E." surname="Surov" fullname="Edward Surov">
        <organization>TheSoul Publishing Ltd.</organization>
        <address>
          <postal>
            <city>Limassol</city>
            <country>Cyprus</country>
          </postal>
          <email>esurov.tsp@gmail.com</email>
        </address>
      </contact>
      <contact initials="G." surname="Dennis" fullname="Greg Dennis">
        <organization/>
        <address>
          <postal>
            <city>Auckland</city>
            <country>New Zealand</country>
          </postal>
          <email>gregsdennis@yahoo.com</email>
          <uri>https://github.com/gregsdennis</uri>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y92XYcR7Ig+O5f4UqpCglUZhKJhQu4iCAASqghQV6CKule
iEcZmRkAQkxEZEVEAoRAzOmP6Pfuhz73sR/nA+r+yXzBfMLY5lssIKil6qVx
qiggItzd3Nzc3Mzcln6/r8639LpS02ySRmfxlp7m0XHZT+LyuP9zkaXzqDzt
j6Mi7s+iMi5KNYnKLV2UUzXJ0iJOi0WxpZfKfBEvqWIxPkuKIsnS8nIOXe3v
vX2u1CxKT7Z0nKp5sqW0LrOJbUB/TeN5eQqPNvDv4vIsj48L74siy8vKo0l2
dhanJTzCJ6pMyhmM1vnr4auD1xH29W+LOL/U8Yd5HhM4hT7Oco3vOyoaj/MY
5my+VlEeR1t6+81bdXHiHuvvv1HvL/hvNYWpb+m11TVAVLQoT7N8S/UBkDzD
geNpUmY5/MkIPCzj4yjV3/zX/1MUaYzPsxw6fh5NTk+zyWkxOV3MYr0L0zpb
pFOcTlJebgUPsin0s9vf2BiuP0AUAAJiwPphlqaA8TKP/ut/xPrBXfp0kZY5
NP8mzs+i9BIexWdRMsMlQjAGJ1lMYDw9Pu1PZYjBNG4H/5vZZaoPsvwsSU/K
LDXgLy15gNAfDPb3STo5BbqgiebxCWDbvKdZyK8C5Xf/F/w1P81S80aAPYFB
B6kd9OkJPh7AOrfDuRPlMGqqn2U4cQvnd2lyHudFUv7X/yr1szwGQtFv/2Pf
A/51VpTHsBh6fX11Y2PVzoQ/9tC/dn9980EzjmUKf9l40N9YG/bXhvf7d9cf
rA3djCbROHta/pIMACqFe6XMk/GiNJTDc3gZ5e8z/TJ5v5glk2Ri5rCfHs8W
H3ajMurB75OBBfF1UkQ+QPtv3YBnZ6abCvZ4qL3pRZRP9eEiz87NOG9P48Ns
MdOvF+NZUpwC7vWLcuqGe5GcRUWRzfwhdy7n+aJww8YF9jgoi3njsN8ASejd
OE2Twna7vZi8B6Yw9bs9iC/0f8SRPDZUAY2LKTV+ehmdZhl1rvUiT7b0aVnO
i607d06S8nQxxjd3vO+VStJjpIwSyGFLfan1m+c765uba7Ax4gmyLkWP7j5Y
HW7peZakTMENjwxH6Gd5coIcDLhWlJ8gKVkYZJMN0ri8E+VlMpnFxZ2/AvvE
hne4DXMpy1/+3//23/UP9JvhTfSZYS+afto4Cv58gqtobbjW6r3+6lqfiPMH
5o/fr+8M3uzt9D8gd19b7a+tDleHa8MN+GJv44ctH94nMtq+QWeW6jKenKbZ
LDu5pFns7bzcPpzkybykqfzw8oXuQjfLupjHk+Q4mVCr2uz6QuyHr+jPIs6T
uMBVM5OHN3f293b02trm+r0tmMfdcFr45+GL/Z29lkVxhFFO1h/cmefZPCui
Wb+AXRL306x0cMlkD/GN9t7g1Pprd9fqI8AAFxcXg3hyFvWJUlJqE81ww9+Z
447ieRd3jhOkBurq8G1/+83Ot3dMv70/ra2u51P4F7kbfI0PduNJfDaOc/h1
+ODBg8F8euwD6aH7BRyti+gk1oc+pntAMLCPcLvbcWCvJ/g3j9K2FnswG1hp
bzYexhGW/nCNN8n9BxsPgMmNiSE/e/Xqxd72Qf/F9veHzWsRp4OL5H0yh1lG
hCD8686zDBh7lP4UzU7icR59+SK6KPyZynst7/UM36vUbWtY/7e791dlDls6
KiZJQn883kIo15C7P9t5vXbXfpJEaSTb33x1f7h2l2e1fncNZrUoj+/z35tr
6xvQ6zg9llmvbcJ7FIv473sbD9ahy757cvf++n3gxTjPPgpBRR94Erza7+8O
miSrBF6DnAKd8C/w6XcH+zuvdluIGmlukSZ4RBEe6axDIvuOHw43BquDVfOX
oYM+Pa7QkdnZcApo+f4f/9uSjtmEf+MBNPYAZLKT5RVqa6Mlr1tolaIYlyzO
gh0MJ+fqA3rCvMWM+Xr3+e83Y3UepwuilZM8W8yZA2uS/LTmc8asxlNcGzqw
4WPiHrAuuFwXJ3bF7rTJx0oNBgPV7/eBXlBEm5RKWWY/jY+TNC50hFIInrPF
ZVpGH4hfFvEsnpT4EEAHoZXa4p8EaBeISiPdLevzaLaIC3WcZ2fQEb2lRwNF
w54l0+kMwHj0BfzBA0KPevvFLkjZukjO5rPk+FKP41l2ofv9J+pqa5GmC+Q0
8XRLm98ed46jWRF3UDR/3Ik/TGaLady55m4XBfRZ6CvYJLbpNXXG71lGS6KZ
Bj0AsK5nWVno7BhF9jlxxHiqARE0P3j890UGSkUP+0xS6oe6GXWG6/rxY700
XF/qjICe9Oir0UDr72MNXHwcjWeXujgF0WWqYZpTRCtOLwZklpdwDBJAXyIn
y7PpYkJkSouhr65o1a6vAUBoNs/mi1mUg+CKqgLoFEzSTI68OqBiTMoFzBPJ
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
35E9D/64usZf8REynX+pUBfRgcDYC1KmBskebTZEloo+ujY2DwAJSvZsmrZ8
JoqjfDc20pk//nipQfhyLVY+u8XXT29qslfJq0sNHj+m9bqh2U4tf/CE0l9O
uemyxZP3Ie1qS04hmHYUK0fgEyMMlEy4VLYUuRLSFRXQi3yjjHERdgcwbRl7
HMrZu+eSS59nMwon7+JVbVa6J8s0lniaHFAxneQXWEKmONiL9lEfC5oXZGGp
fMeXwpwzzuV8CaJ2ZpmL4omcp4qghi94uANMe2OqKRdOnRW2KjrZoeElsxn6
fTcDVEmQRIsCoFHlBXQx5Nv9bnBpv9xTHOhDRJBl7zmppuGGdBHucVvnq/qp
8FSMoaSFdDMys7Rl1CqzsMa92vQqeXW4JwqwMcj9iW+yTIUigvGngfhZJL5r
BmrGNfQxaJfGzIIJDpOJDW7ylo5SBNrpypWan5eIHAzJvGqyEJlcImS+Onbl
5V25M1tnKo9VlSTJXlihUrFmo88WMGhYXeN/fRaJG1BB2VeYoiTRDoor86wo
+843W4nnivgtScQXFvU7w7PaKyrGlTRrgNjyhiYx4DSbsK9yZAu80i7CD8xu
bZqR8RmeRGmWUmKJql2rp/1jHe8KzBu0iPANJlXNDqGqjUSFGCmjk42m8Yy/
A02pPwGrC8kHply8nVd2m5BMDs8g9kSU6oW2Sh1D9lJSbjkIxr6p7D1VlhwY
+4ZoKIUHzGxH8ll5Y1OJNBy1eYbUBxK5LUWEf1xElw/Z9QmRqCrdLVLp0Fqn
G5e6muW8p80FOfZcy4GOTerk/Dy8kD/qr4tMp6vhLdi5tYrXeMXbOgPxEzFh
ZiHp/IKKR3P6ulQu1IJqfLw3paAf6KWLAlWKgeq+rb2U5C82QRWqHljqyc0D
66wJOxHmJMkrTZ3z8IAxDiN5lpV9yyLR+YY/7Ad16pdV01Nx3ZFXQeH66jMZ
TR7z3YS9c9KVzvm5avwYXVzW7ukVM0Di6tZP+dVDvcTEvaQaP7JQWOprv/Xa
O9wxX9O3yPBUrTnPTaOjTYYb/E8fVvvD5+R4kWdYl3hK2eAafwDk1f7a3Rsv
3qTbVZzd0g0d3e9vPrtdR5s7+sf2jjZ3xcdJVecuU/3Th7trlJJzrJ8d6jFw
TErao7/7y+rq6v32ju/epVbH+vlzvn84RlZGrXZuaLVHrVL94rmeYV5L12q7
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
LZsFx3SVr6riG6cZ04HzHwW06PQ8fgEA

-->

</rfc>
