<?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.27 (Ruby 3.2.1) -->
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-jsonpath-base-11" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocDepth="4" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.16.0 -->
  <front>
    <title abbrev="JSONPath">JSONPath: Query expressions for JSON</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-jsonpath-base-11"/>
    <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>
      <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>
    <!-- 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>
        <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>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>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 argument. This can be thought of
as a sequence of names and indexes navigating to the value through
the objects and arrays in the argument, with the empty sequence
indicating the 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 argument.</t>
          </dd>
          <dt>Root Node:</dt>
          <dd>
            <t>The unique node whose value is the entire argument.</t>
          </dd>
          <dt>Root Node Identifier:</dt>
          <dd>
            <t>The expression <tt>$</tt> which refers to the root node of the 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>Segment:</dt>
          <dd>
            <t>One of the constructs which select children (<tt>[]</tt>)
or descendants (<tt>..[]</tt>) of an input value.</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 that can take Arguments (actual parameters) in a function-expression.</t>
          </dd>
          <dt>Normalized Path:</dt>
          <dd>
            <t>A simple form of JSONPath expression that identifies a node in a value by
providing a query that results in exactly that node.  Similar
to, but syntactically different from, a JSON Pointer <xref target="RFC6901"/>.</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. JSON string values are sequences of Unicode scalar values.</t>
          </dd>
          <dt>Singular Nodelist:</dt>
          <dd>
            <t>A nodelist containing at most one node.</t>
          </dd>
          <dt>Singular Query:</dt>
          <dd>
            <t>A JSONPath expression built from segments each of which, regardless of the input value,
produces a Singular Nodelist.</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>
        </dl>
        <section anchor="json-values-as-trees-of-nodes">
          <name>JSON Values as Trees of Nodes</name>
          <t>This document models the 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
argument as a nodelist (a list of nodes).</t>
          <t>Nodes are the selectable parts of the 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 picks up <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>
      </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 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 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 (described later).</t>
        </section>
        <section anchor="segments">
          <name>Segments</name>
          <t>Segments select children (<tt>[]</tt>) or descendants (<tt>..[]</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>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>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>
      <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 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>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 a nodelist.</t>
        <t>Segments can be added to a query to drill further into the structure of the input value.</t>
        <t>The nodelist resulting from the root identifier contains a single node,
the 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 that 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 anchor="worked-example">
          <name>Worked Example</name>
          <t>Consider this example. With the 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 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 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>
            <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 0x10000, 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
in the table below:</t>
            <table>
              <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">\b</td>
                  <td align="center">U+0008</td>
                  <td align="left">BS backspace</td>
                </tr>
                <tr>
                  <td align="center">\t</td>
                  <td align="center">U+0009</td>
                  <td align="left">HT horizontal tab</td>
                </tr>
                <tr>
                  <td align="center">\n</td>
                  <td align="center">U+000A</td>
                  <td align="left">LF line feed</td>
                </tr>
                <tr>
                  <td align="center">\f</td>
                  <td align="center">U+000C</td>
                  <td align="left">FF form feed</td>
                </tr>
                <tr>
                  <td align="center">\r</td>
                  <td align="center">U+000D</td>
                  <td align="left">CR carriage return</td>
                </tr>
                <tr>
                  <td align="center">\"</td>
                  <td align="center">U+0022</td>
                  <td align="left">quotation mark</td>
                </tr>
                <tr>
                  <td align="center">\'</td>
                  <td align="center">U+0027</td>
                  <td align="left">apostrophe</td>
                </tr>
                <tr>
                  <td align="center">\/</td>
                  <td align="center">U+002F</td>
                  <td align="left">slash (solidus)</td>
                </tr>
                <tr>
                  <td align="center">\\</td>
                  <td align="center">U+005C</td>
                  <td align="left">backslash (reverse solidus)</td>
                </tr>
                <tr>
                  <td align="center">\uXXXX</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 that 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 following examples show the name selector in use by child segments.</t>
            <table>
              <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 <tt>wildcard</tt> 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 <tt>wildcard</tt> 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 following examples show the <tt>wildcard</tt> selector in use by a child segment.</t>
            <table>
              <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 numbered="false" toc="exclude" 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:
1. An <tt>index-selector</tt> is an integer (in base 10, as in JSON numbers).
2. As in JSON numbers, the syntax does not allow octal-like integers with leading zeros such as <tt>01</tt> or <tt>-01</tt>.</t>
          </section>
          <section numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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 following examples show the index selector in use by a child segment.</t>
            <table>
              <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 numbered="false" toc="exclude" 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.</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 numbered="false" toc="exclude" 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 follows:</t>
              <table>
                <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 numbered="false" toc="exclude" 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 following examples show the array slice selector in use by a child segment.</t>
            <table>
              <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>$[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>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 numbered="false" toc="exclude" anchor="syntax-4">
            <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 that 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).
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 result type is declared as
<tt>LogicalType</tt> (see <xref target="typesys"/>), it tests whether the result
is <tt>LogicalTrue</tt>; if the function result type is declared as
<tt>NodesType</tt>, it tests whether the result is non-empty.
If the declared function result type is <tt>ValueType</tt>, its use in a
test expression is not well-typed.</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; and
function expressions (see <xref target="fnex"/>) of type <tt>ValueType</tt> or
<tt>NodesType</tt> (see <xref target="type-conv"/>).</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>The following table 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>
              <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 numbered="false" toc="exclude" 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>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>
            <section numbered="false" toc="exclude" 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 numbered="false" toc="exclude" 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>:</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>Note that comparisons using the operator <tt>&lt;</tt> yield false if either value being
compared is an object, array, boolean, or <tt>null</tt>.</t>
              <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 numbered="false" toc="exclude" anchor="logical-operators">
              <name>Logical Operators</name>
              <t>The logical AND, OR, and NOT operators have the normal semantics of Boolean algebra and
obey its laws (see, for example, <xref target="BOOLEAN-LAWS"/>).</t>
            </section>
            <section numbered="false" toc="exclude" anchor="function-extensions">
              <name>Function Extensions</name>
              <t>Filter selectors may use function extensions, which are covered in <xref target="fnex"/>.</t>
            </section>
          </section>
          <section numbered="false" toc="exclude" 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>
              <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 that 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 following examples show the filter selector in use by a child segment.</t>
            <table>
              <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 four 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.</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 that 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)
                      function-expr
]]></sourcecode>
        <t>A function argument is a <tt>filter-query</tt> or a <tt>comparable</tt>.</t>
        <t>According to <xref target="filter-selector"/>, a <tt>function-expr</tt> is valid as a <tt>filter-query</tt>
or a <tt>comparable</tt>.</t>
        <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>A type is a set of instances.
Declared types enable checking a JSONPath query for well-typedness
independent of any argument the JSONPath query is applied to.</t>
          <t><xref target="tbl-types"/> defines the available types in terms of abstract instances, where <tt>v</tt> denotes a value, and <tt>nl</tt> denotes
a nodelist.</t>
          <table anchor="tbl-types">
            <name>Function extension type system</name>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Abstract Instances</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>ValueType</tt></td>
                <td align="left">
                  <tt>Value(v)</tt>, <tt>Nothing</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>LogicalType</tt></td>
                <td align="left">
                  <tt>LogicalTrue</tt>, <tt>LogicalFalse</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>NodesType</tt></td>
                <td align="left">
                  <tt>Nodes(nl)</tt></td>
              </tr>
            </tbody>
          </table>
          <t>Notes:</t>
          <ul spacing="normal">
            <li>
              <tt>ValueType</tt> is an abstraction of a JSON value or <tt>Nothing</tt>.</li>
            <li>
              <tt>LogicalType</tt> is an abstraction of the result of a <tt>logical-expr</tt>.
Its two instances, <tt>LogicalTrue</tt> and <tt>LogicalFalse</tt>, are not related to
the JSON literals <tt>true</tt> and <tt>false</tt> and have no direct syntactical representation in JSONPath.</li>
            <li>
              <tt>NodesType</tt> is an abstraction of a <tt>filter-query</tt> (which appears
in a test expression or as a function argument).
Members of <tt>NodesType</tt> have no direct syntactical representation in JSONPath.</li>
          </ul>
          <t>The abstract instances above can be obtained from the concrete representations in <xref target="tbl-typerep"/>.</t>
          <table anchor="tbl-typerep">
            <name>Concrete representations of abstract instances</name>
            <thead>
              <tr>
                <th align="center">Abstract Instance</th>
                <th align="center">Concrete Representations</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="center">
                  <tt>Value(v)</tt></td>
                <td align="center">JSON value <tt>v</tt></td>
              </tr>
              <tr>
                <td align="center">
                  <tt>Nothing</tt></td>
                <td align="center">A representation of the absence of a JSON value, distinct from the JSON literal <tt>null</tt>, e.g., from a Singular Query or <tt>filter-query</tt> resulting in an empty nodelist</td>
              </tr>
              <tr>
                <td align="center">
                  <tt>Nodes(nl)</tt></td>
                <td align="center">A list of zero or more nodes, e.g., from a <tt>filter-query</tt> resulting in the nodelist <tt>nl</tt>, which may or may not be empty</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="type-conv">
          <name>Type Conversion</name>
          <t>The following implicit type conversion may occur:</t>
          <ul spacing="normal">
            <li>
              <t>Where a member of <tt>NodesType</tt> needs to be converted to a
<tt>LogicalType</tt>, the conversion proceeds as follows:
              </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>
            </li>
          </ul>
          <t>Given an expression with a declared type of <tt>NodesType</tt>, a <tt>ValueType</tt> can be obtained using a function such as <tt>value()</tt> (see <xref target="value"/>).</t>
          <t>The well-typedness of function expressions can now be defined in terms of this type system.</t>
        </section>
        <section anchor="well-typedness-of-function-expressions">
          <name>Well-Typedness of Function Expressions</name>
          <t>A function expression is well-typed if all of the following are true:</t>
          <ul spacing="normal">
            <li>If it occurs directly in a test expression, the function is declared
to have a result type of <tt>LogicalType</tt>, or (conversion applies)
<tt>NodesType</tt>.</li>
            <li>If it occurs directly as a <tt>comparable</tt> in a comparison, the
function is declared to have a result type of <tt>ValueType</tt>, or
(conversion applies) <tt>NodesType</tt>.</li>
            <li>Otherwise, it occurs as an argument in another function
expression, and the following rules for function arguments apply to
its declared result type.</li>
            <li>
              <t>Each argument of the function can be used for the declared type of the corresponding declared
parameter according to one of the following rules:
              </t>
              <ul spacing="normal">
                <li>The argument is a function expression with declared result type that is the same as the declared type of the parameter.</li>
                <li>The argument is a literal primitive value and the defined type of the parameter is <tt>ValueType</tt>.</li>
                <li>The argument is a Singular Query or <tt>filter-query</tt> (which includes
Singular Queries), or a function expression with declared result
type <tt>NodesType</tt> and the defined type of the parameter is <tt>NodesType</tt>.
Where the declared type of the parameter is
not <tt>NodesType</tt>, a conversion applies.</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 "length" 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 "count" 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.
Note that there is no deduplication of the nodelist.</t>
        </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 "match" 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>.
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>. <!-- XXX -->
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 "search" 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>.
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>. <!-- XXX -->
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 "value" 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>
        </section>
        <section numbered="false" toc="exclude" anchor="examples-6">
          <name>Examples</name>
          <table>
            <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>
            </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-5">
            <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 that 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 that 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>
              <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-6">
            <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>.
As with the similar shorthand of a <tt>child-segment</tt>, note that 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 that <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 that <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>
              <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 that 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>
            <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 canonical representation of the location of a node in a value and
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 that 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 canonical representation of a nodelist is as a JSON arrays 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 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 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>
            <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 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>).</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 array</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>
          </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 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 an 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 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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <author fullname="T. Narten" initials="T." surname="Narten">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <author fullname="T. Hansen" initials="T." surname="Hansen">
              <organization/>
            </author>
            <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="6" month="February" 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-03"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="K. Zyp" initials="K." surname="Zyp">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <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>
    <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 that 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 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 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 that 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+S923YbR7Io+J5fkYbdTZANQAQvulAXiyIpmz0SpS3Sbe1N
azUKQJEsC6xCVxVI0RRnzUec93MeztqP8zgf0PtP5gvmEyZueasqgJTt7j5r
hqtbJqsqMyMzIyPjHt1uV11s6XWlxtkojc7jLT3Oo5Oym8TlSffnIkunUXnW
HUZF3J1EZVyUahSVW7oox2qUpUWcFrNiSy+V+SxeUsVseJ4URZKl5dUUutrf
O3qp1CRKT7d0nKppsqW0LrORbUB/jeNpeQaPNvDv4uo8j08K74siy8vKo1F2
fh6nJTzCJ6pMygmM1vrz4ZuDtxH29W+zOL/S8adpHhM4hT7Jco3vWyoaDvMY
5my+VlEeR1t6+92Rujx1j/WP36mPl/y3GsPUt/Ta6hosVDQrz7J8S3UBkDzD
geNxUmY5/MkLeFjGJ1Gqv/uv/6so0hifZzl0/DIanZ1lo7NidDabxHoXpnU+
S8c4naS82goeZGPoZ7e7sdFff4RLAAsQw6ofZmkKK17m0X/991g/uk+fztIy
h+bfxfl5lF7Bo/g8Sia4RQhG7zSLCYznJ2fdsQzRG8fzwf9ucpXqgyw/T9LT
MksN+EtLHiD0B4P9Y5KOzgAvaKJ5fAqrbd7TLORXgfKH/w3+mp5lqXkjwJ7C
oL3UDvr8FB/3YJ/nw7kT5TBqql9kOHEL5w9pchHnRVL+1/8s9Ys8BkTRR/+x
7wH/NivKE9gMvb6+urGxamfCH3vLv/ZwffNR8xrLFP608ai7sdbvrvUfdu+v
P1rruxmNomH2vPwl6QFUCs9KmSfDWWkwh+fwOso/Zvp18nE2SUbJyMxhPz2Z
zD7tRmXUgd9HPQvi26SIfID2j9yA5+emm8rq8VB748soH+vDWZ5dmHGOzuLD
bDbRb2fDSVKcwdrrV+XYDfcqOY+KIpv4Q+5cTfNZ4YaNC+yxVxbTxmG/A5TQ
u3GaJoXtdns2+ghEYex3exBf6v+II3lssAIaF2Nq/PwqOssy6lzrWZ5s6bOy
nBZb9+6dJuXZbIhv7nnfK5WkJ4gZJaDDlvpa63cvd9Y3N9fgYMQjJF2KHt1/
tNrf0tMsSRmDGx4ZitDN8uQUKRhQrSg/RVSyMMgh66VxeS/Ky2Q0iYt7fwby
iQ3vcRumUpa+/N//x3/T7+k3Q5voM0NeNP3Moyj4cwtV0dpQrdUH3dW1LiHn
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
LtuOtUzC/4q69r6xGFr/VDrs9vlr+O+ckanP8DNBb2Uxv03NOjzMck0iargN
m3kYowBy+4dXhbdZIBQJ2XcXv9s4IPtRO1m2J2SQ/Kk/CDWW7vgNooGSrBnQ
atW1YjIjbehlH16yNg9EunFYjdumJPbwx26q2VNYqQQWlaaENbO/33+1B0+e
8IJt0cof7r3a2znSOAH6GxskQE+wJ1lzaqcU7iqp9Awh98egHu0YvIhPdPLF
Y/gUzDF/8P0izs/qPW3eOiJ0BUeif4mdm1R5ujXEf0b4zxj/ifGfE/zn9Dcr
+Rq1Tv86Vd+WmKxJ1cc2Upi4p/UzdtM1+o4pNR0ew5PQ/tjuNrfW6h2Omzpc
r3ZIHa2Zrlj6kL5OGvraXNSXVU/70KEoIh2eug69vuNwGG855FdvTla/ed+D
w4dpowKfv5Dmd389Vr05VAW0gDXabsKgqm70ZZjQXl9XE9rf2EJALpLSv1n5
bowpl1hFcMidYfdEVbOjoSWAqJsUrySFKLkcsicNX8W1Vp4T4kniUpJYL52M
Sskbnl9JeQK/iJnN6jGzrpmVrP4YzY5LhWy+EwLaMrF7PKnlTmMaf9YGrNRi
rlc6eLe7tHHMHaCejYziZ7F1dJQYZ+WtpQwZmjjaP5LOt7GWgBmnYKdQqt0J
/aF8yPlN0GipXmTZJAY2Tur7sYQSVKzFap0sOwFXo1dkpBXs9TxKKNYdFcvi
d2AKShHoQediraGtxmRGNtIB5eTdmXV/dastzrMdf3+8CQKDFiemmhX5CJtw
1ND6mOVNwZ82jUk1Yx95yioeDivmciYP11fQCd/HaVgXccWvQ7TSVPUvKAAs
Nd6ISZOcEibiOciUKPVKQUT3k/PKNGrL0+FScMCmXiQRG+EZgi5C0A3rDoo8
25gfkqEUL1wSXmIOzyarnEkVEzUlbmIdmV/Q1+Zt8pzSbJYoJQoXwBIv7ylC
QWtsQCF8c+665KaGuZ7Uik0garORoVrIZShtOCWcya9y+Ds2FWlQuNpfD3Rp
mQrVS/18SVbaFOLF2pToIkomFLdiei44qRolOsUax8ZCYxMZKfcl1gtlmcNm
baB0px3LzERS9pnqV5/ivuQmIVjQj2jkRXJ5adZrzyVcBfTqcheYS+L6OonS
qMvDAR9JbJZfUcTKrsaoy9mLI4wYgE0kz1VjVC9MxIYrdWxyVSVcK8WTj6Qf
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

-->

</rfc>
