<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.6.6 (Ruby 3.1.1) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc comments="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-jsonpath-base-05" category="std" consensus="true" submissionType="IETF" xml:lang="en" tocDepth="4" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JSONPath">JSONPath: Query expressions for JSON</title>

    <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></organization>
      <address>
        <postal>
          <street></street>
          <city>Winchester</city>
          <region></region>
          <code></code>
          <country>UK</country>
        </postal>
        <phone></phone>
        <email>glyn.normington@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization ascii="Universitaet Bremen TZI">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="2022"/>

    <area>ART</area>
    <workgroup>JSONPath WG</workgroup>
    <keyword>JSON</keyword>

    <abstract>


<t>JSONPath defines a string syntax for selecting and extracting values
within a JavaScript Object Notation (JSON, RFC 8259) value.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <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/"/>.
      </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>JavaScript Object Notation (JSON, <xref target="RFC8259"/>) is a popular representation
format for structured data values.
JSONPath defines a string syntax for identifying values
within 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 <spanx style="verb">%x2318</spanx>.</t>

<t>The terminology of <xref target="RFC8259"/> applies except where clarified below.
The terms "Primitive" and "Structured" are used to group
the types as in <xref section="1" sectionFormat="of" target="RFC8259"/>.
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 specification are defined below.</t>

<dl>
  <dt>Value:</dt>
  <dd>
    <t>As per <xref target="RFC8259"/>, a structure complying to the generic data model of JSON, i.e.,
composed of components 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.</t>
  </dd>
  <dt>Member:</dt>
  <dd>
    <t>A name/value pair in an object.  (Not itself a value.)</t>
  </dd>
  <dt>Name:</dt>
  <dd>
    <t>The name in a name/value pair constituting a member.  (Also known as
"key", "tag", or "label".)
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 an array. (Not to be confused with XML element.)</t>
  </dd>
  <dt>Index:</dt>
  <dd>
    <t>A non-negative integer that identifies a specific element in an array.
Note that the term <em>indexing</em> is also used for accessing elements
using negative integers (<xref target="index-semantics"/>), and for accessing
member values in an object using their member name.</t>
  </dd>
  <dt>Query:</dt>
  <dd>
    <t>Short name for JSONPath expression.</t>
  </dd>
  <dt>Argument:</dt>
  <dd>
    <t>Short name for the value a JSONPath expression is applied to.</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>Children (of a node):</dt>
  <dd>
    <t>If the node is an array, each of its elements,
or if the node is an object, each its member values (but not its
member names). If the node is neither an array nor an object, it has no descendants.</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>Nodelist:</dt>
  <dd>
    <t>A list of nodes.  <!-- ordered list?  Maybe TBD by issues #27 and #60 -->
The output of applying a query to an argument is manifested as a list of nodes.
While this list can be represented in JSON, e.g. as an array, the
nodelist is an abstract concept unrelated to JSON values.</t>
  </dd>
  <dt>Normalized Path:</dt>
  <dd>
    <t>A simple form of JSONPath expression that identifies a node 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>Singular Path:</dt>
  <dd>
    <t>A JSONPath expression built from selectors which each select at most one node.</t>
  </dd>
</dl>

<t>For the purposes of this specification, a value as defined by
<xref target="RFC8259"/> is also viewed as a tree of nodes.
Each node, in turn, holds a value.
Further nodes within each value are the elements of arrays and the
member values of objects and are themselves values.
(The type of the value held by a node
may also be referred to as the type of the node.)</t>

<t>A query is applied to an argument, and the output is a nodelist.</t>

</section>
<section anchor="history"><name>History</name>

<t>This document picks up Stefan Gössner's popular JSONPath proposal
dated 2007-02-21 <xref target="JSONPath-orig"/> and provides a normative definition
for it.</t>

<t><xref target="inspired-by-xpath"/> describes how JSONPath was inspired by XML's XPath
<xref target="XPath"></xref>.</t>

<t>JSONPath was intended as a light-weight companion to JSON
implementations on platforms such as PHP and JavaScript, so instead of
defining its own expression language like XPath did, JSONPath
delegated this to the expression language of the platform.
While the languages in which JSONPath is used do have significant
commonalities, over time this caused non-portability of JSONPath
expressions between the ensuing platform-specific dialects.</t>

<t>The present specification intends to remove platform dependencies and
serve as a common JSONPath specification that can be used across
platforms.  Obviously, this means that backwards compatibility could
not always be achieved; a design principle of this specification 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="overview"><name>Overview of JSONPath Expressions</name>

<t>JSONPath expressions are applied to a JSON value, the <em>argument</em>.
Within the JSONPath expression, the abstract name <spanx style="verb">$</spanx> is used to refer
to the <em>root node</em> of the argument, i.e., to the argument as a whole.</t>

<t>JSONPath expressions can use the <em>dot notation</em></t>

<figure><artwork><![CDATA[
$.store.book[0].title
]]></artwork></figure>

<t>or the more general <em>bracket notation</em></t>

<figure><artwork><![CDATA[
$['store']['book'][0]['title']
]]></artwork></figure>

<t>to build paths that are input to a JSONPath implementation.</t>

<t>JSONPath allows the wildcard symbol <spanx style="verb">*</spanx> to select any member of an
object or any element of an array (<xref target="wildcard"/>).
The descendant operator <spanx style="verb">..</spanx> selects all the descendants (<xref target="descendant-selector"/>) of a node.
The array slice
syntax <spanx style="verb">[start:end:step]</spanx> allows selecting a regular selection of an
element from an array, giving a start position, an end position, and
possibly a step value that moves the position from the start to the
end (<xref target="slice"/>).</t>

<t>Filter expressions are supported via the syntax <spanx style="verb">?(&lt;boolean expr&gt;)</spanx> as in</t>

<figure><artwork><![CDATA[
$.store.book[?(@.price < 10)].title
]]></artwork></figure>

<t><xref target="tbl-overview"/> provides a quick overview of the JSONPath syntax elements.</t>

<texttable title="Overview of JSONPath" anchor="tbl-overview">
      <ttcol align='left'>JSONPath</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">$</spanx></c>
      <c><xref target="root-selector">the root node</xref></c>
      <c><spanx style="verb">@</spanx></c>
      <c>the current node: within <xref target="filter-selector">filter selectors</xref></c>
      <c><spanx style="verb">.name</spanx></c>
      <c>child selectors for JSON objects: <xref target="dot-selector">dot selector</xref></c>
      <c><spanx style="verb">['name']</spanx></c>
      <c>child selectors for JSON objects: <xref target="index-selector">index selector</xref></c>
      <c><spanx style="verb">..</spanx></c>
      <c>descendants: <xref target="descendant-selector">descendant selector</xref></c>
      <c><spanx style="verb">*</spanx></c>
      <c>all child member values and array elements: <xref target="wildcard">dot wildcard selector</xref>, <xref target="index-wildcard-selector">index wildcard selector</xref></c>
      <c><spanx style="verb">[3]</spanx></c>
      <c><xref target="index-selector">index (subscript) selector</xref>: index current node as an array (from 0)</c>
      <c><spanx style="verb">[..,..]</spanx></c>
      <c><xref target="list-selector">list selector</xref>: allow combining selector styles</c>
      <c><spanx style="verb">[0:100:5]</spanx></c>
      <c><xref target="slice">array slice selector</xref>: start:end:step</c>
      <c><spanx style="verb">?...</spanx></c>
      <c><xref target="filter-selector">filter selector</xref></c>
      <c><spanx style="verb">()</spanx></c>
      <c>expression: within <xref target="filter-selector">filter selectors</xref></c>
</texttable>

</section>
</section>
<section anchor="jsonpath-examples"><name>JSONPath Examples</name>

<t>This section provides some more examples for JSONPath expressions.
The examples are based on the simple JSON value shown in
<xref target="fig-example-value"/>, which was patterned after a
typical XML example representing a bookstore (that also has bicycles).</t>

<figure title="Example JSON value" anchor="fig-example-value"><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": 19.95
    }
  }
}
]]></sourcecode></figure>

<t>The examples in <xref target="tbl-example"/> use the expression mechanism to obtain
the number of elements in an array, to test for the presence of a
member in a object, and to perform numeric comparisons of member values with a
constant.</t>

<texttable title="Example JSONPath expressions applied to the example JSON value" anchor="tbl-example">
      <ttcol align='left'>JSONPath</ttcol>
      <ttcol align='left'>Result</ttcol>
      <c><spanx style="verb">$.store.book[*].author</spanx></c>
      <c>the authors of all books in the store</c>
      <c><spanx style="verb">$..author</spanx></c>
      <c>all authors</c>
      <c><spanx style="verb">$.store.*</spanx></c>
      <c>all things in store, which are some books and a red bicycle</c>
      <c><spanx style="verb">$.store..price</spanx></c>
      <c>the prices of everything in the store</c>
      <c><spanx style="verb">$..book[2]</spanx></c>
      <c>the third book</c>
      <c><spanx style="verb">$..book[-1]</spanx></c>
      <c>the last book in order</c>
      <c><spanx style="verb">$..book[0,1]</spanx><br /><spanx style="verb">$..book[:2]</spanx></c>
      <c>the first two books</c>
      <c><spanx style="verb">$..book[?(@.isbn)]</spanx></c>
      <c>filter all books with isbn number</c>
      <c><spanx style="verb">$..book[?(@.price&lt;10)]</spanx></c>
      <c>filter all books cheaper than 10</c>
      <c><spanx style="verb">$..*</spanx></c>
      <c>all elements in XML document; all member values and array elements contained in input value</c>
</texttable>

<!-- XXX: fine tune: is $..* really member values + array elements -->

<!-- back to normington draft; not yet merged up where needed (e.g., terminology). -->

</section>
<section anchor="jsonpath-syntax-and-semantics"><name>JSONPath Syntax and Semantics</name>

<section anchor="synsem-overview"><name>Overview</name>

<t>A JSONPath query is a string which selects zero or more nodes of a piece of JSON.</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.</t>

<t>To be valid, 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]).</t>

<t>To be valid, strings on the right hand side of the <spanx style="verb">=~</spanx> regex matching
operator need to conform to <xref target="I-D.draft-bormann-jsonpath-iregexp"/>.</t>

<t>The well-formedness and the validity of JSONPath queries are independent of
the JSON value the query is applied to; no further errors 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
the present specification.  However, the implementation <bcp14>MUST NOT</bcp14>
silently malfunction.  Specifically, if a valid JSONPath query is
evaluated against a structured value whose size doesn't 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="processing-model"><name>Processing Model</name>

<t>In this specification, the semantics of a JSONPath query are defined
in terms of a <em>processing model</em>.  That model is not prescriptive of
the internal workings of an implementation:  Implementations may wish
(or need) to design a different process that yields results that are
consistent with this model.</t>

<t>In the processing model,
a valid query is executed against a value, the <em>argument</em>, and
produces a list of zero or more nodes of the value.</t>

<t>The query is a sequence of zero or more <em>selectors</em>, each of
which is applied to the result of the previous selector and provides
input to the next selector.
These results and inputs take the form of a <em>nodelist</em>, i.e., a
sequence of zero or more nodes.</t>

<t>The nodelist going into the first selector contains a single node,
the argument.
The nodelist resulting from the last selector 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 the API must be capable of presenting an empty nodelist as
the result of the query.</t>

<t>A selector performs its function on each of the nodes in its input
nodelist, during such a function execution, such a node is referred to
as the "current node".  Each of these function executions produces a
nodelist, which are then concatenated into
the result of the selector.</t>

<t>The processing within a selector may execute nested queries,
which are in turn handled with the processing model defined here.
Typically, the argument to that query will be the current node of the
selector or a set of nodes subordinate to that current node.</t>

</section>
<section anchor="syntax"><name>Syntax</name>

<t>Syntactically, a JSONPath query consists of a root selector (<spanx style="verb">$</spanx>), which
stands for a nodelist that contains the root node of the argument,
followed by a possibly empty sequence of <em>selectors</em>.</t>

<figure><sourcecode type="abnf"><![CDATA[
json-path = root-selector *(S (dot-selector        /
                               dot-wild-selector   /
                               index-selector      /
                               index-wild-selector /
                               slice-selector      /
                               descendant-selector /
                               filter-selector     /
                               list-selector))
]]></sourcecode></figure>

<t>The syntax and semantics of each selector is defined below.</t>

</section>
<section anchor="semantics"><name>Semantics</name>

<t>The root selector <spanx style="verb">$</spanx> not only selects the root node of the argument,
but it also produces as output a list consisting of one
node: the argument itself.</t>

<t>A selector may select zero or more nodes for further processing.
A syntactically valid selector <bcp14>MUST NOT</bcp14> produce errors.
This means that some
operations that might be considered erroneous, such as indexing beyond the
end of an array,
simply result in fewer nodes being selected.</t>

<t>But a selector doesn't just act on a single node: a selector acts on
each of the nodes in its input nodelist and concatenates the resultant nodelists
to form the result nodelist of the selector.</t>

<t>For each node in the list, the selector selects zero or more nodes,
each of which is a descendant of the node or the node itself.</t>

<t>For instance, with the argument <spanx style="verb">{"a":[{"b":0},{"b":1},{"c":2}]}</spanx>, the
query <spanx style="verb">$.a[*].b</spanx> selects the following list of nodes: <spanx style="verb">0</spanx>, <spanx style="verb">1</spanx>
(denoted here by their value).
Let's walk through this in detail.</t>

<t>The query consists of <spanx style="verb">$</spanx> followed by three selectors: <spanx style="verb">.a</spanx>, <spanx style="verb">[*]</spanx>, and <spanx style="verb">.b</spanx>.</t>

<t>Firstly, <spanx style="verb">$</spanx> selects the root node which is the argument.
So the result is a list consisting of just the root node.</t>

<t>Next, <spanx style="verb">.a</spanx> selects from any input node of type object and selects the
node of any
member value of the input
node corresponding to the member name <spanx style="verb">"a"</spanx>.
The result is again a list of one node: <spanx style="verb">[{"b":0},{"b":1},{"c":2}]</spanx>.</t>

<t>Next, <spanx style="verb">[*]</spanx> selects from an input node of type array all its elements
(if the input note were of type object, it would select all its member
values, but not the member names).
The result is a list of three nodes: <spanx style="verb">{"b":0}</spanx>, <spanx style="verb">{"b":1}</spanx>, and <spanx style="verb">{"c":2}</spanx>.</t>

<t>Finally, <spanx style="verb">.b</spanx> selects from any input node of type object with a member name
<spanx style="verb">b</spanx> and selects the node of the member value of the input node corresponding to that name.
The result is a list containing <spanx style="verb">0</spanx>, <spanx style="verb">1</spanx>.
This is the concatenation of three lists, two of length one containing
<spanx style="verb">0</spanx>, <spanx style="verb">1</spanx>, respectively, and one of length zero.</t>

<t>As a consequence of this approach, if any of the selectors selects no nodes,
then the whole query selects no nodes.</t>

<t>In what follows, the semantics of each selector are defined for each type
of node.</t>

</section>
<section anchor="selectors"><name>Selectors</name>

<t>A JSONPath query consists of a sequence of selectors. Valid selectors are</t>

<t><list style="symbols">
  <t>Root selector <spanx style="verb">$</spanx> (used at the start of a query and in expressions)</t>
  <t>Dot selector <spanx style="verb">.&lt;name&gt;</spanx>, used with object member names exclusively.</t>
  <t>Dot wildcard selector <spanx style="verb">.*</spanx>.</t>
  <t>Index selector <spanx style="verb">[&lt;index&gt;]</spanx>, where <spanx style="verb">&lt;index&gt;</spanx> is either a (possibly
negative, see <xref target="index-semantics"/>) array index or an object member name.</t>
  <t>Index wildcard selector <spanx style="verb">[*]</spanx>.</t>
  <t>Array slice selector <spanx style="verb">[&lt;start&gt;:&lt;end&gt;:&lt;step&gt;]</spanx>, where the optional
values <spanx style="verb">&lt;start&gt;</spanx>, <spanx style="verb">&lt;end&gt;</spanx>, and <spanx style="verb">&lt;step&gt;</spanx> are integer literals.</t>
  <t>Descendants selector <spanx style="verb">..</spanx>.</t>
  <t>List selector <spanx style="verb">[&lt;sel1&gt;,&lt;sel2&gt;,...,&lt;selN&gt;]</spanx>, holding a comma
separated list of index and slice selectors.</t>
  <t>Filter selector <spanx style="verb">[?(&lt;expr&gt;)]</spanx></t>
  <t>Current item selector <spanx style="verb">@</spanx> (used in expressions)</t>
</list></t>

<section anchor="root-selector"><name>Root Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-1"><name>Syntax</name>

<t>Every valid JSONPath query <bcp14>MUST</bcp14> begin with the root selector <spanx style="verb">$</spanx>.</t>

<figure><sourcecode type="abnf"><![CDATA[
root-selector  = "$"
]]></sourcecode></figure>

</section>
<section numbered="false" toc="exclude" anchor="semantics-1"><name>Semantics</name>

<t>The Argument — the root JSON value — becomes the root node, which is
addressed by the root selector <spanx style="verb">$</spanx>.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{"k": "v"}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Root selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Path</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$</spanx></c>
      <c><spanx style="verb">{"k": "v"}</spanx></c>
      <c><spanx style="verb">$</spanx></c>
      <c>Root node</c>
</texttable>

</section>
</section>
<section anchor="dot-selector"><name>Dot Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-2"><name>Syntax</name>

<t>A dot selector starts with a dot <spanx style="verb">.</spanx> followed by an object's member name.</t>

<figure><sourcecode type="abnf"><![CDATA[
dot-selector    = "." dot-member-name
dot-member-name = 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></figure>

<t>Member names containing characters other than allowed by
<spanx style="verb">dot-selector</spanx> — such as space ` <spanx style="verb">, minus </spanx>-<spanx style="verb">, or dot </spanx>.<spanx style="verb">
characters — MUST NOT be used with the </spanx>dot-selector<spanx style="verb">.
(Such member names can be addressed by the
</spanx>index-selector` instead.)</t>

</section>
<section numbered="false" toc="exclude" anchor="semantics-2"><name>Semantics</name>

<t>The <spanx style="verb">dot-selector</spanx> selects the node of the member value corresponding
to the member name from any JSON object in its input nodelist. It selects no nodes from any other JSON value.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples-1"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{"j": {"k": 3}}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Dot selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.j</spanx></c>
      <c><spanx style="verb">{"k": 3}</spanx></c>
      <c><spanx style="verb">$['j']</spanx></c>
      <c>Named value of an object</c>
      <c><spanx style="verb">$.j.k</spanx></c>
      <c><spanx style="verb">3</spanx></c>
      <c><spanx style="verb">$['j']['k']</spanx></c>
      <c>Named value in nested object</c>
</texttable>

</section>
</section>
<section anchor="wildcard"><name>Dot Wildcard Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-3"><name>Syntax</name>

<t>The dot wildcard selector has the form <spanx style="verb">.*</spanx> as defined in the
following syntax:</t>

<figure><sourcecode type="abnf"><![CDATA[
dot-wild-selector    = "." "*"            ;  dot followed by asterisk
]]></sourcecode></figure>

</section>
<section numbered="false" toc="exclude" anchor="semantics-3"><name>Semantics</name>

<t>A <spanx style="verb">dot-wild-selector</spanx> acts as a wildcard by selecting the nodes of
all member values of an object in its input nodelist as well as all
element nodes of an array in its input nodelist.
Applying the <spanx style="verb">dot-wild-selector</spanx> to a primitive JSON value (number,
string, or true/false/null) selects no node.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples-2"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3]
}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Dot wildcard selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.o.*</spanx></c>
      <c><spanx style="verb">1</spanx> <br /> <spanx style="verb">2</spanx></c>
      <c><spanx style="verb">$['o']['j']</spanx> <br /> <spanx style="verb">$['o']['k']</spanx></c>
      <c>Object values</c>
      <c><spanx style="verb">$.o.*</spanx></c>
      <c><spanx style="verb">2</spanx> <br /> <spanx style="verb">1</spanx></c>
      <c><spanx style="verb">$['o']['k']</spanx> <br /> <spanx style="verb">$['o']['j']</spanx></c>
      <c>Alternative result</c>
      <c><spanx style="verb">$.a.*</spanx></c>
      <c><spanx style="verb">5</spanx> <br /> <spanx style="verb">3</spanx></c>
      <c><spanx style="verb">$['a'][0]</spanx> <br /> <spanx style="verb">$['a'][1]</spanx></c>
      <c>Array members</c>
</texttable>

</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 <spanx style="verb">[&lt;index&gt;]</spanx> addresses at most one object member value or at most one array element value.</t>

<figure><sourcecode type="abnf"><![CDATA[
index-selector      = "[" S (quoted-member-name / element-index) S "]"
]]></sourcecode></figure>

<t>Applying the <spanx style="verb">index-selector</spanx> to an object value in its input nodelist, a
<spanx style="verb">quoted-member-name</spanx> string is required to select the corresponding
member value.
In contrast to JSON,
the JSONPath syntax allows strings to be enclosed in <em>single</em> or <em>double</em> quotes.</t>

<figure><sourcecode type="abnf"><![CDATA[
quoted-member-name  = 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 /                         ; s. RFC 8259
                      %x23-26 /                         ; omit "
                      %x28-5B /                         ; omit '
                      %x5D-10FFFF                       ; omit \

escapable           = ( %x62 / %x66 / %x6E / %x72 / %x74 / ; \b \f \n \r \t
                          ; b /         ;  BS backspace U+0008
                          ; t /         ;  HT horizontal tab U+0009
                          ; n /         ;  LF line feed U+000A
                          ; f /         ;  FF form feed U+000C
                          ; r /         ;  CR carriage return U+000D
                          "/" /          ;  /  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"

; Task from 2021-06-15 interim: update ABNF later
]]></sourcecode></figure>

<t>Applying the <spanx style="verb">index-selector</spanx> to an array, a numerical <spanx style="verb">element-index</spanx>
is required to select the corresponding
element. JSONPath allows it to be negative (see <xref target="index-semantics"/>).</t>

<figure><sourcecode type="abnf"><![CDATA[
element-index   = int                             ; decimal integer

int             = ["-"] ( "0" / (DIGIT1 *DIGIT) ) ; -  optional
DIGIT1          = %x31-39                         ; 1-9 non-zero digit
]]></sourcecode></figure>

<t>Notes:
1. <spanx style="verb">double-quoted</spanx> strings follow the JSON string syntax (<xref section="7" sectionFormat="of" target="RFC8259"/>);
   <spanx style="verb">single-quoted</spanx> strings follow an analogous pattern (<xref target="syntax-index"/>).
2. An <spanx style="verb">element-index</spanx> is an integer (in base 10, as in JSON numbers).
3. As in JSON numbers, the syntax does not allow octal-like integers with leading zeros such as <spanx style="verb">01</spanx> or <spanx style="verb">-01</spanx>.</t>

</section>
<section numbered="false" toc="exclude" anchor="index-semantics"><name>Semantics</name>

<t>A <spanx style="verb">quoted-member-name</spanx> string <bcp14>MUST</bcp14> be converted to a
member name by removing the surrounding quotes and
replacing each escape sequence with its equivalent Unicode character, as
in the table below:</t>

<texttable title="Escape Sequence Replacements">
      <ttcol align='center'>Escape Sequence</ttcol>
      <ttcol align='center'>Unicode Character</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>\b</c>
      <c>U+0008</c>
      <c>BS backspace</c>
      <c>\t</c>
      <c>U+0009</c>
      <c>HT horizontal tab</c>
      <c>\n</c>
      <c>U+000A</c>
      <c>LF line feed</c>
      <c>\f</c>
      <c>U+000C</c>
      <c>FF form feed</c>
      <c>\r</c>
      <c>U+000D</c>
      <c>CR carriage return</c>
      <c>\"</c>
      <c>U+0022</c>
      <c>quotation mark</c>
      <c>\'</c>
      <c>U+0027</c>
      <c>apostrophe</c>
      <c>\/</c>
      <c>U+002F</c>
      <c>slash (solidus)</c>
      <c>\\</c>
      <c>U+005C</c>
      <c>backslash (reverse solidus)</c>
      <c>\uXXXX</c>
      <c>U+XXXX</c>
      <c>unicode character</c>
</texttable>

<t>The <spanx style="verb">index-selector</spanx> applied with a <spanx style="verb">quoted-member-name</spanx> to an object
selects the node of the corresponding member value from it, if and only if that object has a member with that name.
Nothing is selected from a value that is not a object.</t>

<t>Array indexing via <spanx style="verb">element-index</spanx> is a way of selecting a particular array element using a zero-based index.
For example, selector <spanx style="verb">[0]</spanx> selects the first and selector <spanx style="verb">[4]</spanx> the fifth element of a sufficiently long array.</t>

<t>A negative <spanx style="verb">element-index</spanx> counts from the array end.
For example, selector <spanx style="verb">[-1]</spanx> selects the last and selector <spanx style="verb">[-2]</spanx> 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>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{
  "o": {"j j": {"k.k": 3}},
  "a": ["a","b"]
}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Index selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.o['j j']['k.k']</spanx></c>
      <c><spanx style="verb">3</spanx></c>
      <c><spanx style="verb">$['o']['j ']['k.k']</spanx></c>
      <c>Named value in nested object</c>
      <c><spanx style="verb">$.o["j j"]["k.k"]</spanx></c>
      <c><spanx style="verb">3</spanx></c>
      <c><spanx style="verb">$['o']['j ']['k.k']</spanx></c>
      <c>Named value in nested object</c>
      <c><spanx style="verb">$.a[1]</spanx></c>
      <c><spanx style="verb">"b"</spanx></c>
      <c><spanx style="verb">$['a'][1]</spanx></c>
      <c>Member of array</c>
      <c><spanx style="verb">$.a[-2]</spanx></c>
      <c><spanx style="verb">"a"</spanx></c>
      <c><spanx style="verb">$['a'][0]</spanx></c>
      <c>Member of array, from the end</c>
</texttable>

</section>
</section>
<section anchor="index-wildcard-selector"><name>Index Wildcard Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-4"><name>Syntax</name>

<t>The index wildcard selector has the form <spanx style="verb">[*]</spanx>.</t>

<figure><sourcecode type="abnf"><![CDATA[
index-wild-selector    = "[" "*" "]"  ;  asterisk enclosed by brackets
]]></sourcecode></figure>

</section>
<section numbered="false" toc="exclude" anchor="semantics-4"><name>Semantics</name>

<t>An <spanx style="verb">index-wild-selector</spanx>
selects the nodes of all member values of an object as well as of all elements of an
array.
Applying the <spanx style="verb">index-wild-selector</spanx> to a primitive JSON value (such as
a number, string, or true/false/null) selects no node.</t>

<t>The <spanx style="verb">index-wild-selector</spanx> behaves identically to the <spanx style="verb">dot-wild-selector</spanx>.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples-4"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3]
}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Index wildcard selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.o.[*]</spanx></c>
      <c><spanx style="verb">1</spanx> <br /> <spanx style="verb">2</spanx></c>
      <c><spanx style="verb">$['o']['j']</spanx> <br /> <spanx style="verb">$['o']['k']</spanx></c>
      <c>Object values</c>
      <c><spanx style="verb">$.o.[*]</spanx></c>
      <c><spanx style="verb">2</spanx> <br /> <spanx style="verb">1</spanx></c>
      <c><spanx style="verb">$['o']['k']</spanx> <br /> <spanx style="verb">$['o']['j']</spanx></c>
      <c>Alternative result</c>
      <c><spanx style="verb">$.a.[*]</spanx></c>
      <c><spanx style="verb">5</spanx> <br /> <spanx style="verb">3</spanx></c>
      <c><spanx style="verb">$['a'][0]</spanx> <br /> <spanx style="verb">$['a'][1]</spanx></c>
      <c>Array members</c>
</texttable>

</section>
</section>
<section anchor="slice"><name>Array Slice Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-5"><name>Syntax</name>

<t>The array slice selector has the form <spanx style="verb">[&lt;start&gt;:&lt;end&gt;:&lt;step&gt;]</spanx>.
It selects elements starting at index <spanx style="verb">&lt;start&gt;</spanx>, ending at — but
not including — <spanx style="verb">&lt;end&gt;</spanx>, while incrementing by <spanx style="verb">step</spanx>.</t>

<figure><sourcecode type="abnf"><![CDATA[
slice-selector = "[" S slice-index S "]"

slice-index    =  [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
RS             = 1*B       ; required blank space

]]></sourcecode></figure>

<t>The <spanx style="verb">slice-selector</spanx> consists of three optional decimal integers separated by colons.</t>

</section>
<section numbered="false" toc="exclude" anchor="semantics-5"><name>Semantics</name>

<t>The <spanx style="verb">slice-selector</spanx> 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 non-normative.</t>

<t>Array indexing is a way of selecting a particular element of an array using
a 0-based index.
For example, the expression <spanx style="verb">[0]</spanx> selects the first element of a non-empty array.</t>

<t>Negative indices index from the end of an array.
For example, the expression <spanx style="verb">[-2]</spanx> selects the last but one element of an array with at least two elements.</t>

<t>Array slicing is inspired by the behaviour of the <spanx style="verb">Array.prototype.slice</spanx> method
of the JavaScript language as defined by the ECMA-262 standard <xref target="ECMA-262"/>,
with the addition of the <spanx style="verb">step</spanx> parameter, which is inspired by the Python slice expression.</t>

<t>The array slice expression <spanx style="verb">[start:end:step]</spanx> selects elements at indices starting at <spanx style="verb">start</spanx>,
incrementing by <spanx style="verb">step</spanx>, and ending with <spanx style="verb">end</spanx> (which is itself excluded).
So, for example, the expression <spanx style="verb">[1:3]</spanx> (where <spanx style="verb">step</spanx> defaults to <spanx style="verb">1</spanx>)
selects elements with indices <spanx style="verb">1</spanx> and <spanx style="verb">2</spanx> (in that order) whereas
<spanx style="verb">[1:5:2]</spanx> selects elements with indices <spanx style="verb">1</spanx> and <spanx style="verb">3</spanx>.</t>

<t>When <spanx style="verb">step</spanx> is negative, elements are selected in reverse order. Thus,
for example, <spanx style="verb">[5:1:-2]</spanx> selects elements with indices <spanx style="verb">5</spanx> and <spanx style="verb">3</spanx>, in
that order and <spanx style="verb">[::-1]</spanx> selects all the elements of an array in
reverse order.</t>

<t>When <spanx style="verb">step</spanx> is <spanx style="verb">0</spanx>, no elements are selected.
(This is the one case that differs from the behaviour of Python, which
raises an error in this case.)</t>

<t>The following section specifies the behaviour fully, without depending on
JavaScript or Python behaviour.</t>

</section>
<section numbered="false" toc="exclude" anchor="detailed-semantics"><name>Detailed Semantics</name>

<t>An array selector is either an array slice or an array index, which is defined
in terms of an array slice.</t>

<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 <spanx style="verb">step</spanx> parameter.
It selects no nodes from a node that is not an array.</t>

<t>A slice is defined by the two slice parameters, <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx>, and
an iteration delta, <spanx style="verb">step</spanx>.
Each of these parameters is
optional. <spanx style="verb">len</spanx> is the length of the input array.</t>

<t>The default value for <spanx style="verb">step</spanx> is <spanx style="verb">1</spanx>.
The default values for <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx> depend on the sign of <spanx style="verb">step</spanx>,
as follows:</t>

<texttable title="Default array slice start and end values">
      <ttcol align='left'>Condition</ttcol>
      <ttcol align='left'>start</ttcol>
      <ttcol align='left'>end</ttcol>
      <c>step &gt;= 0</c>
      <c>0</c>
      <c>len</c>
      <c>step &lt; 0</c>
      <c>len - 1</c>
      <c>-len - 1</c>
</texttable>

<t>Slice expression parameters <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx> are not directly usable
as slice bounds and must first be normalized.
Normalization for this purpose is defined as:</t>

<figure><artwork><![CDATA[
FUNCTION Normalize(i, len):
  IF i >= 0 THEN
    RETURN i
  ELSE
    RETURN len + i
  END IF
]]></artwork></figure>

<t>The result of the array indexing expression <spanx style="verb">[i]</spanx> applied to an array
of length <spanx style="verb">len</spanx> is defined to be the result of the array
slicing expression <spanx style="verb">[i:Normalize(i, len)+1:1]</spanx>.</t>

<t>Slice expression parameters <spanx style="verb">start</spanx> and <spanx style="verb">end</spanx> are used to derive slice bounds <spanx style="verb">lower</spanx> and <spanx style="verb">upper</spanx>.
The direction of the iteration, defined
by the sign of <spanx style="verb">step</spanx>, determines which of the parameters is the lower bound and which
is the upper bound:</t>

<figure><artwork><![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)
]]></artwork></figure>

<t>The slice expression selects elements with indices between the lower and
upper bounds.
In the following pseudocode, the <spanx style="verb">a(i)</spanx> construct expresses the
0-based indexing operation on the underlying array.</t>

<figure><artwork><![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
]]></artwork></figure>

<t>When <spanx style="verb">step = 0</spanx>, no elements are selected and the result array is empty.</t>

<t>To be valid, the slice expression parameters <bcp14>MUST</bcp14> be in the I-JSON
range of exact values, see <xref target="synsem-overview"/>.</t>

</section>
</section>
<section numbered="false" toc="exclude" anchor="examples-5"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
["a", "b", "c", "d", "e", "f", "g"]
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Array slice selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$[1:3]</spanx></c>
      <c><spanx style="verb">"b"</spanx> <br /> <spanx style="verb">"c"</spanx></c>
      <c><spanx style="verb">$[1]</spanx> <br /> <spanx style="verb">$[2]</spanx></c>
      <c>Slice with default step</c>
      <c><spanx style="verb">$[1:5:2]</spanx></c>
      <c><spanx style="verb">"b"</spanx> <br /> <spanx style="verb">"d"</spanx></c>
      <c><spanx style="verb">$[1]</spanx> <br /> <spanx style="verb">$[3]</spanx></c>
      <c>Slice with step 2</c>
      <c><spanx style="verb">$[5:1:-2]</spanx></c>
      <c><spanx style="verb">"f"</spanx> <br /> <spanx style="verb">"d"</spanx></c>
      <c><spanx style="verb">$[5]</spanx> <br /> <spanx style="verb">$[3]</spanx></c>
      <c>Slice with negative step</c>
      <c><spanx style="verb">$[::-1]</spanx></c>
      <c><spanx style="verb">"g"</spanx> <br /> <spanx style="verb">"f"</spanx> <br /> <spanx style="verb">"e"</spanx> <br /> <spanx style="verb">"d"</spanx> <br /> <spanx style="verb">"c"</spanx> <br /> <spanx style="verb">"b"</spanx> <br /> <spanx style="verb">"a"</spanx></c>
      <c><spanx style="verb">$[6]</spanx> <br /> <spanx style="verb">$[5]</spanx> <br /> <spanx style="verb">$[4]</spanx> <br /> <spanx style="verb">$[3]</spanx> <br /> <spanx style="verb">$[2]</spanx> <br /> <spanx style="verb">$[1]</spanx> <br /> <spanx style="verb">$[0]</spanx></c>
      <c>Slice in reverse order</c>
</texttable>

</section>
</section>
<section anchor="descendant-selector"><name>Descendant Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-6"><name>Syntax</name>

<t>The descendant selector starts with a double dot <spanx style="verb">..</spanx> and can be
followed by an object member name (similar to the <spanx style="verb">dot-selector</spanx>),
by an <spanx style="verb">index-selector</spanx> acting on objects or arrays, or by a wildcard.</t>

<figure><sourcecode type="abnf"><![CDATA[
descendant-selector = ".." ( dot-member-name      /  ; ..<name>
                             index-selector       /  ; ..[<index>]
                             index-wild-selector  /  ; ..[*]
                             "*"                     ; ..*
                           )
]]></sourcecode></figure>

</section>
<section numbered="false" toc="exclude" anchor="semantics-6"><name>Semantics</name>

<t>The <spanx style="verb">descendant-selector</spanx> selects certain descendants of a node:</t>

<t><list style="symbols">
  <t>the <spanx style="verb">..&lt;name&gt;</spanx> form (and the <spanx style="verb">..[&lt;index&gt;]</spanx> form where <spanx style="verb">&lt;index&gt;</spanx> is a <spanx style="verb">quoted-member-name</spanx>) selects those descendants of the node that are member values of an object with the given member name.</t>
  <t>the <spanx style="verb">..[&lt;index&gt;]</spanx> where <spanx style="verb">&lt;index&gt;</spanx> is an <spanx style="verb">element-index</spanx> selects those descendants of the node that are array elements with the given index.</t>
  <t>the <spanx style="verb">..[*]</spanx> and <spanx style="verb">..*</spanx> forms select all the descendants of the node.</t>
</list></t>

<t>In the resultant nodelist:</t>

<t><list style="symbols">
  <t>nodes occur before their children, and</t>
  <t>nodes of an array occur in array order.</t>
</list></t>

<t>Children of an object may occur in any order, since JSON objects are unordered.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples-6"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{
  "o": {"j": 1, "k": 2},
  "a": [5, 3, [{"j": 4}]]
}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Descendant selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$..j</spanx></c>
      <c><spanx style="verb">1</spanx> <br /> <spanx style="verb">4</spanx></c>
      <c><spanx style="verb">$['o']['j']</spanx> <br /> <spanx style="verb">$['a'][2][0]['j']</spanx></c>
      <c>Object values</c>
      <c><spanx style="verb">$..j</spanx></c>
      <c><spanx style="verb">4</spanx> <br /> <spanx style="verb">1</spanx></c>
      <c><spanx style="verb">$['a'][2][0]['j']</spanx> <br /> <spanx style="verb">$['o']['j']</spanx></c>
      <c>Alternative result</c>
      <c><spanx style="verb">$..[0]</spanx></c>
      <c><spanx style="verb">5</spanx> <br /> <spanx style="verb">{"j": 4}</spanx></c>
      <c><spanx style="verb">$['a'][0]</spanx> <br /> <spanx style="verb">$['a'][2][0]</spanx></c>
      <c>Array values</c>
      <c><spanx style="verb">$..[0]</spanx></c>
      <c><spanx style="verb">{"j": 4}</spanx> <br /> <spanx style="verb">5</spanx></c>
      <c><spanx style="verb">$['a'][2][0]</spanx> <br /> <spanx style="verb">$['a'][0]</spanx></c>
      <c>Alternative result</c>
      <c><spanx style="verb">$..[*]</spanx></c>
      <c><spanx style="verb">{"j": 1, "k" : 2}</spanx> <br /> <spanx style="verb">[5, 3, [{"j": 4}]]</spanx> <br /> <spanx style="verb">1</spanx> <br /> <spanx style="verb">2</spanx> <br /> <spanx style="verb">5</spanx> <br /> <spanx style="verb">3</spanx> <br /> <spanx style="verb">[{"j": 4}]</spanx> <br /> <spanx style="verb">{"j": 4}</spanx> <br /> <spanx style="verb">4</spanx></c>
      <c><spanx style="verb">$['o']</spanx> <br /> <spanx style="verb">$['a']</spanx> <br /> <spanx style="verb">$['o']['j']</spanx> <br /> <spanx style="verb">$['o']['k']</spanx> <br /> <spanx style="verb">$['a'][0]</spanx> <br /> <spanx style="verb">$['a'][1]</spanx> <br /> <spanx style="verb">$['a'][2]</spanx> <br /> <spanx style="verb">$['a'][2][0]</spanx> <br /> <spanx style="verb">$['a'][2][0]['j']</spanx></c>
      <c>All values</c>
      <c><spanx style="verb">$..*</spanx></c>
      <c><spanx style="verb">[5, 3, [{"j": 4}]]</spanx> <br /> <spanx style="verb">{"j": 1, "k" : 2}</spanx> <br /> <spanx style="verb">2</spanx> <br /> <spanx style="verb">1</spanx> <br /> <spanx style="verb">5</spanx> <br /> <spanx style="verb">3</spanx> <br /> <spanx style="verb">[{"j": 4}]</spanx> <br /> <spanx style="verb">{"j": 4}</spanx> <br /> <spanx style="verb">4</spanx></c>
      <c><spanx style="verb">$['a']</spanx> <br /> <spanx style="verb">$['o']</spanx> <br /> <spanx style="verb">$['o']['k']</spanx> <br /> <spanx style="verb">$['o']['j']</spanx> <br /> <spanx style="verb">$['a'][0]</spanx> <br /> <spanx style="verb">$['a'][1]</spanx> <br /> <spanx style="verb">$['a'][2]</spanx> <br /> <spanx style="verb">$['a'][2][0]</spanx> <br /> <spanx style="verb">$['a'][2][0]['j']</spanx></c>
      <c>All values</c>
</texttable>

<t>Note: The ordering of the results for the <spanx style="verb">$..[*]</spanx> and <spanx style="verb">$..*</spanx> examples above is not guaranteed, except that:</t>

<t><list style="symbols">
  <t><spanx style="verb">{"j": 1, "k": 2}</spanx> must appear before <spanx style="verb">1</spanx> and <spanx style="verb">2</spanx>,</t>
  <t><spanx style="verb">[5, 3, [{"j": 4}]]</spanx> must appear before <spanx style="verb">5</spanx>, <spanx style="verb">3</spanx>, and <spanx style="verb">[{"j": 4}]</spanx>,</t>
  <t><spanx style="verb">5</spanx> must appear before <spanx style="verb">3</spanx> which must appear before <spanx style="verb">[{"j": 4}]</spanx>,</t>
  <t><spanx style="verb">[{"j": 4}]</spanx> must appear before <spanx style="verb">{"j": 4}</spanx>, and</t>
  <t><spanx style="verb">{"j": 4}</spanx> must appear before <spanx style="verb">4</spanx>.</t>
</list></t>

</section>
</section>
<section anchor="filter-selector"><name>Filter Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-7"><name>Syntax</name>

<t>The filter selector has the form <spanx style="verb">[?&lt;expr&gt;]</spanx>. It works via iterating over structured values, i.e. arrays and objects.</t>

<figure><sourcecode type="abnf"><![CDATA[
filter-selector    = "[" S filter S "]"
filter             = "?" S boolean-expr
]]></sourcecode></figure>

<t>During iteration process each array element or object member is visited and its value — accessible via symbol <spanx style="verb">@</spanx> — or one of its descendants — uniquely defined by a relative path — is tested against a boolean expression <spanx style="verb">boolean-expr</spanx>.</t>

<t>The current item is selected if and only if the result is <spanx style="verb">true</spanx>.</t>

<figure><sourcecode type="abnf"><![CDATA[
boolean-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        = exist-expr /
                    paren-expr /
                    relation-expr
exist-expr        = [neg-op S] singular-path          ; path existence or non-existence
]]></sourcecode></figure>

<t>Paths in filter expressions are Singular Paths, each of which selects at most one node.</t>

<figure><sourcecode type="abnf"><![CDATA[
singular-path     = rel-singular-path / abs-singular-path
rel-singular-path = "@" *(S (dot-selector / index-selector))
abs-singular-path = root-selector *(S (dot-selector / index-selector))
]]></sourcecode></figure>

<t>Parentheses can be used with <spanx style="verb">boolean-expr</spanx> for grouping. So filter selection syntax in the original proposal <spanx style="verb">[?(&lt;expr&gt;)]</spanx> is naturally contained in the current lean syntax <spanx style="verb">[?&lt;expr&gt;]</spanx> as a special case.</t>

<figure><sourcecode type="abnf"><![CDATA[
paren-expr        = [neg-op S] "(" S boolean-expr S ")" ; parenthesized expression
neg-op            = "!"                               ; not operator

relation-expr = comp-expr /                           ; comparison test
                regex-expr                            ; regular expression test
]]></sourcecode></figure>

<t>Comparisons are restricted to Singular Path values and primitive values (such as number, string, <spanx style="verb">true</spanx>, <spanx style="verb">false</spanx>, <spanx style="verb">null</spanx>).</t>

<t>Comparisons with complex values will fail, i.e. no selection occurs.
<!-- issue: comparison with structured value --></t>

<t>Data types are not implicitly converted in comparisons.
So <spanx style="verb">"13 == '13'"</spanx> selects no node.</t>

<t>A member or element value by itself in a Boolean context is
interpreted as <spanx style="verb">false</spanx> only if it does not exist.
Otherwise it is interpreted as <spanx style="verb">true</spanx>.
To be more specific about the actual value, explicit comparisons are necessary. This existence test — as an exception to the general rule — also works with structured values.</t>

<figure><sourcecode type="abnf"><![CDATA[
comp-expr    = comparable S comp-op S comparable
comparable   = number / string-literal /              ; primitive ...
               true / false / null /                  ; values only
               singular-path                          ; Singular Path value
comp-op      = "==" / "!=" /                          ; comparison ...
               "<"  / ">"  /                          ; operators
               "<=" / ">="
]]></sourcecode></figure>

<t>Alphabetic characters in ABNF are case-insensitive, so "e" can be either "e" or "E".</t>

<t><spanx style="verb">true</spanx>, <spanx style="verb">false</spanx>, and <spanx style="verb">null</spanx> are lower-case only (case-sensitive).</t>

<figure><sourcecode type="abnf"><![CDATA[
number       = int [ 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></figure>

<t>Regular expression tests can be applied to JSON string values
(<xref section="7" sectionFormat="of" target="RFC8259"/>) only
(on the left-hand side of <spanx style="verb">=~</spanx>); they yield false otherwise.</t>

<t>The syntax of regular expressions in the string-literals on the right-hand
side of <spanx style="verb">=~</spanx> is as defined in <xref target="I-D.draft-bormann-jsonpath-iregexp"/>.</t>

<figure><sourcecode type="abnf"><![CDATA[
regex-expr   = (singular-path / string-literal) S regex-op S regex
regex-op     = "=~"                                   ; regular expression match
regex        = string-literal                         ; I-Regexp
]]></sourcecode></figure>

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

<texttable title="Filter expression operator precedence">
      <ttcol align='center'>Precedence</ttcol>
      <ttcol align='center'>Operator type</ttcol>
      <ttcol align='center'>Syntax</ttcol>
      <c>5</c>
      <c>Grouping</c>
      <c><spanx style="verb">(...)</spanx></c>
      <c>4</c>
      <c>Logical NOT</c>
      <c><spanx style="verb">!</spanx></c>
      <c>3</c>
      <c>Relations</c>
      <c><spanx style="verb">==</spanx> <spanx style="verb">!=</spanx><br /><spanx style="verb">&lt;</spanx> <spanx style="verb">&lt;=</spanx> <spanx style="verb">&gt;</spanx> <spanx style="verb">&gt;=</spanx><br /><spanx style="verb">=~</spanx></c>
      <c>2</c>
      <c>Logical AND</c>
      <c><spanx style="verb">&amp;&amp;</spanx></c>
      <c>1</c>
      <c>Logical OR</c>
      <c><spanx style="verb">¦¦</spanx></c>
</texttable>

</section>
<section numbered="false" toc="exclude" anchor="semantics-7"><name>Semantics</name>

<t>The <spanx style="verb">filter-selector</spanx> 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 other value types, it will select nothing.</t>

<t>A relative path, beginning with <spanx style="verb">@</spanx>, refers to the current array element or member value as the
filter selector iterates over the array or object.</t>

<t>Comparisons using one of the operators <spanx style="verb">&lt;</spanx>, <spanx style="verb">&lt;=</spanx>, <spanx style="verb">&gt;</spanx>, and <spanx style="verb">&gt;=</spanx> are between numeric values only.
Using these operators to compare other types of values produces a "false" comparison result.</t>

<t>The semantics of regular expressions are as defined in <xref target="I-D.draft-bormann-jsonpath-iregexp"/>.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples-7"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
{
  "a": [3, 5, 1, 2, 4, 6, {"b": "ij"}, {"b": "ik"}],
  "o": {"p": 1, "q": 2, "r": 3, "s": 5, "t": {"u": 6}}
}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Filter selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.a[?@&gt;3.5]</spanx></c>
      <c><spanx style="verb">5</spanx> <br /> <spanx style="verb">4</spanx> <br /> <spanx style="verb">6</spanx></c>
      <c><spanx style="verb">$['a'][1]</spanx> <br /> <spanx style="verb">$['a'][4]</spanx> <br /> <spanx style="verb">$['a'][5]</spanx></c>
      <c>Array value comparison</c>
      <c><spanx style="verb">$.a[?@.b]</spanx></c>
      <c><spanx style="verb">{"b": "ij"}</spanx> <br /> <spanx style="verb">{"b": "ik"}</spanx></c>
      <c><spanx style="verb">$['a'][6]</spanx> <br /> <spanx style="verb">$['a'][7]</spanx></c>
      <c>Array value existence</c>
      <c><spanx style="verb">$.a[?@&lt;2 || @.b == "ik"]</spanx></c>
      <c><spanx style="verb">1</spanx> <br /> <spanx style="verb">{"b": "ik"}</spanx></c>
      <c><spanx style="verb">$['a'][2]</spanx> <br /> <spanx style="verb">$['a'][7]</spanx></c>
      <c>Array value logical OR</c>
      <c><spanx style="verb">$.a[?@.b =~ "i.*"]</spanx></c>
      <c><spanx style="verb">{"b": "ij"}</spanx> <br /> <spanx style="verb">{"b": "ik"}</spanx></c>
      <c><spanx style="verb">$['a'][6]</spanx> <br /> <spanx style="verb">$['a'][7]</spanx></c>
      <c>Array value regular expression</c>
      <c><spanx style="verb">$.o[?@&gt;1 &amp;&amp; @&lt;4]</spanx></c>
      <c><spanx style="verb">2</spanx> <br /> <spanx style="verb">3</spanx></c>
      <c><spanx style="verb">$['o']['q']</spanx> <br /> <spanx style="verb">$['o']['r']</spanx></c>
      <c>Object value logical AND</c>
      <c><spanx style="verb">$.o[?@&gt;1 &amp;&amp; @&lt;4]</spanx></c>
      <c><spanx style="verb">3</spanx> <br /> <spanx style="verb">2</spanx></c>
      <c><spanx style="verb">$['o']['r']</spanx> <br /> <spanx style="verb">$['o']['q']</spanx></c>
      <c>Alternative result</c>
      <c><spanx style="verb">$.o[?@.u || @.x]</spanx></c>
      <c><spanx style="verb">{"u": 6}</spanx></c>
      <c><spanx style="verb">$['o']['t']</spanx></c>
      <c>Object value logical OR</c>
</texttable>

</section>
</section>
<section anchor="list-selector"><name>List Selector</name>

<t>The list selector allows combining member names, array indices, and
slices in a single selector.</t>

<t>Note: The list selector was called "union selector" in
<xref target="JSONPath-orig"/>, as it was intended to solve use cases addressed by
the union selector in XPath.
However, the term "union" has the connotation of a set operation that involves
merging input sets while avoiding duplicates, so the concept was
renamed into "list selector".</t>

<section numbered="false" toc="exclude" anchor="syntax-8"><name>Syntax</name>

<t>The list selector is syntactically related to the
<spanx style="verb">index-selector</spanx> and the <spanx style="verb">slice-selector</spanx>.
It contains two or more entries, separated by commas.</t>

<figure><sourcecode type="abnf"><![CDATA[
list-selector  = "[" S list-entry 1*(S "," S list-entry) S "]"

list-entry     =  ( quoted-member-name /
                    element-index      /
                    slice-index /
                    filter
                  )
]]></sourcecode></figure>

</section>
<section numbered="false" toc="exclude" anchor="semantics-8"><name>Semantics</name>

<t>A list selector selects the nodes that are selected by at least one of
the selector entries in the list and yields the concatenation of the
lists (in the order of the selector entries) of nodes selected by the
selector entries.
Note that any node selected in more than one of the selector entries is kept
as many times in the node list.</t>

<t>To be valid, integer values in the <spanx style="verb">element-index</spanx> and <spanx style="verb">slice-index</spanx>
components <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="examples-8"><name>Examples</name>

<t>JSON document:</t>

<figure><artwork><![CDATA[
["a", "b", "c", "d", "e", "f", "g"]
]]></artwork></figure>

<t>Queries:</t>

<texttable title="List selector examples">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$[0, 3]</spanx></c>
      <c><spanx style="verb">"a"</spanx> <br /> <spanx style="verb">"d"</spanx></c>
      <c><spanx style="verb">$[0]</spanx> <br /> <spanx style="verb">$[3]</spanx></c>
      <c>Indices</c>
      <c><spanx style="verb">$[0:2, 5]</spanx></c>
      <c><spanx style="verb">"a"</spanx> <br /> <spanx style="verb">"b"</spanx> <br /> <spanx style="verb">"f"</spanx></c>
      <c><spanx style="verb">$[0]</spanx> <br /> <spanx style="verb">$[1]</spanx> <br /> <spanx style="verb">$[5]</spanx></c>
      <c>Slice and index</c>
      <c><spanx style="verb">$[0, 0]</spanx></c>
      <c><spanx style="verb">"a"</spanx> <br /> <spanx style="verb">"a"</spanx></c>
      <c><spanx style="verb">$[0]</spanx> <br /> <spanx style="verb">$[0]</spanx></c>
      <c>Duplicated entries</c>
</texttable>

</section>
</section>
</section>
<section anchor="semantics-of-null"><name>Semantics of <spanx style="verb">null</spanx></name>

<t>Note that JSON <spanx style="verb">null</spanx> 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 document:</t>

<figure><artwork><![CDATA[
{"a": null, "b": [null], "c": [{}], "null": 1}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Examples involving (or not involving) null">
      <ttcol align='center'>Query</ttcol>
      <ttcol align='left'>Result</ttcol>
      <ttcol align='center'>Result Paths</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.a</spanx></c>
      <c><spanx style="verb">null</spanx></c>
      <c><spanx style="verb">$['a']</spanx></c>
      <c>Object value</c>
      <c><spanx style="verb">$.a[0]</spanx></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c><spanx style="verb">null</spanx> used as array</c>
      <c><spanx style="verb">$.a.d</spanx></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c><spanx style="verb">null</spanx> used as object</c>
      <c><spanx style="verb">$.b[0]</spanx></c>
      <c><spanx style="verb">null</spanx></c>
      <c><spanx style="verb">$['b'][0]</spanx></c>
      <c>Array value</c>
      <c><spanx style="verb">$.b[*]</spanx></c>
      <c><spanx style="verb">null</spanx></c>
      <c><spanx style="verb">$['b'][0]</spanx></c>
      <c>Array value</c>
      <c><spanx style="verb">$.b[?@]</spanx></c>
      <c><spanx style="verb">null</spanx></c>
      <c><spanx style="verb">$['b'][0]</spanx></c>
      <c>Existence</c>
      <c><spanx style="verb">$.b[?@==null]</spanx></c>
      <c><spanx style="verb">null</spanx></c>
      <c><spanx style="verb">$['b'][0]</spanx></c>
      <c>Comparison</c>
      <c><spanx style="verb">$.c[?(@.d==null)]</spanx></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>Comparison with "missing" value</c>
      <c><spanx style="verb">$.null</spanx></c>
      <c><spanx style="verb">1</spanx></c>
      <c><spanx style="verb">$['null']</spanx></c>
      <c>Not JSON null at all, just a string as object key</c>
</texttable>

</section>
</section>
<section anchor="normalized-paths"><name>Normalized Paths</name>

<t>A Normalized Path is a JSONPath with restricted syntax that identifies a node by providing a query that results in exactly that node. For example,
the JSONPath expression <spanx style="verb">$.book[?(@.price&lt;10)]</spanx> could select two values with Normalized Paths
<spanx style="verb">$['book'][3]</spanx> and <spanx style="verb">$['book'][5]</spanx>. For a given JSON document, there is a one to one correspondence between the document's
nodes and the Normalized Paths that identify these nodes.</t>

<t>A JSONPath implementation may output Normalized Paths instead of, or in addition to, the values identified by these paths.</t>

<t>Since bracket notation is more general than dot notation, it is used to construct Normalized Paths.
Single quotes are used to delimit string member names. This reduces the number of characters that
need escaping when Normalized Paths appear as strings (which are delimited with double quotes) in JSON documents.</t>

<t>The syntax of Normalized Paths is restricted so that there is one and only one way of representing any
given Normalized Path. Putting this another way, for any two distinct Normalized Paths, a JSON document exists
that will yield distinct results when the Normalized Paths are applied to it.</t>

<t>Certain characters are escaped, in one and only one way; all other characters are unescaped.</t>

<t>Normalized Paths are Singular Paths. Not all Singular Paths are Normalized Paths: <spanx style="verb">$[-3]</spanx>, for example, is a Singular
Path, but not a Normalized Path.</t>

<figure><sourcecode type="abnf"><![CDATA[
normalized-path           = root-selector *(normal-index-selector)
normal-index-selector     = "[" (normal-quoted-member-name / normal-element-index) "]"
normal-quoted-member-name = %x27 *normal-single-quoted %x27 ; 'string'
normal-single-quoted      = normal-unescaped /
                            ESC normal-escapable
normal-unescaped          = %x20-26 /                       ; omit control codes
                            %x28-5B /                       ; omit '
                            %x5D-10FFFF                     ; omit \
normal-escapable          = ( %x62 / %x66 / %x6E / %x72 / %x74 / ; \b \f \n \r \t
                                ; b /         ;  BS backspace U+0008
                                ; t /         ;  HT horizontal tab U+0009
                                ; n /         ;  LF line feed U+000A
                                ; f /         ;  FF form feed U+000C
                                ; r /         ;  CR carriage return U+000D
                                "'" /         ;  ' 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"
                              ("0" %x62) /    ; "0b"      ; omit U+0008-U+000A
                              ("0" %x65-66) /  ; "0e"-"0f" ; omit U+000C-U+000D
                              ("1" normal-HEXDIG)
                            )
normal-HEXDIG             = DIGIT / %x61-66   ; "0"-"9", "a"-"f"
normal-element-index      = "0" / (DIGIT1 *DIGIT) ; non-negative decimal integer
]]></sourcecode></figure>

<section numbered="false" toc="exclude" anchor="examples-10"><name>Examples</name>

<texttable title="Normalized Path examples">
      <ttcol align='center'>Path</ttcol>
      <ttcol align='center'>Normalized Path</ttcol>
      <ttcol align='left'>Comment</ttcol>
      <c><spanx style="verb">$.a</spanx></c>
      <c><spanx style="verb">$['a']</spanx></c>
      <c>Object value</c>
      <c><spanx style="verb">$[1]</spanx></c>
      <c><spanx style="verb">$[1]</spanx></c>
      <c>Array index</c>
      <c><spanx style="verb">$.a.b[1:2]</spanx></c>
      <c><spanx style="verb">$['a']['b'][1]</spanx></c>
      <c>Nested structure</c>
</texttable>

</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>
<section anchor="Security"><name>Security Considerations</name>

<t>Security considerations for JSONPath can stem from</t>

<t><list style="symbols">
  <t>attack vectors on JSONPath implementations, and</t>
  <t>the way JSONPath is used in security-relevant mechanisms.</t>
</list></t>

<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.
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-bormann-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 that trigger surprisingly high, possibly
exponential, CPU usage.</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 evoke unexpected behavior, or take advantage of
differences in behavior between JSONPath implementations.</t>

<t>This also applies to underlying technologies such as UTF-8 (see
<xref section="10" sectionFormat="of" target="RFC3629"/>), the Unicode character set, and JSON.
A characteristic of JSON that can lead to varying results is the
fact that JSON objects are unordered; therefore, the order in which
results of a JSONPath query reflect the presence of JSON object
members can vary with implementations.</t>

</section>
</section>


  </middle>

  <back>


    <references title='Normative References'>





<reference anchor='RFC3629' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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 &quot;Internet JSON&quot;) 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' target='https://www.rfc-editor.org/info/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-bormann-jsonpath-iregexp'>
   <front>
      <title>I-Regexp: An Interoperable Regexp Format</title>
      <author fullname='Carsten Bormann'>
	 <organization>Universität Bremen TZI</organization>
      </author>
      <author fullname='Tim Bray'>
	 <organization>Textuality</organization>
      </author>
      <date day='7' month='March' year='2022'/>
      <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-bormann-jsonpath-iregexp-03'/>
   <format target='https://www.ietf.org/archive/id/draft-bormann-jsonpath-iregexp-03.txt' type='TXT'/>
</reference>



<reference anchor='RFC2119' target='https://www.rfc-editor.org/info/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' target='https://www.rfc-editor.org/info/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 title='Informative References'>





<reference anchor='RFC6901' target='https://www.rfc-editor.org/info/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' initials='A.' surname='Berglund'>
    <organization/>
</author>

<author fullname='Scott Boag' initials='S.' surname='Boag'>
    <organization/>
</author>

<author fullname='Don Chamberlin' initials='D.' surname='Chamberlin'>
    <organization/>
</author>

<author fullname='Mary Fernandez' initials='M.' surname='Fernandez'>
    <organization/>
</author>

<author fullname='Michael Kay' initials='M.' surname='Kay'>
    <organization/>
</author>

<author fullname='Jonathan Robie' initials='J.' surname='Robie'>
    <organization/>
</author>

<author fullname='Jerome Simeon' initials='J.' surname='Simeon'>
    <organization/>
</author>

<date day='14' month='December' year='2010'/>
</front>

<seriesInfo name='World Wide Web Consortium Recommendation' value='REC-xpath20-20101214'/>
<format target='https://www.w3.org/TR/2010/REC-xpath20-20101214' type='HTML'/>
</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></organization>
    </author>
    <date year="n.d."/>
  </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' target='https://www.rfc-editor.org/info/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>




    </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 analyse, 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>

<t><list style="symbols">
  <t>Finding data interactively and extracting them out of <xref target="RFC8259"/>
JSON values without special scripting.</t>
  <t>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.</t>
</list></t>

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

<figure><artwork><![CDATA[
/store/book[1]/title
]]></artwork></figure>

<t>can be realized in the expression</t>

<figure><artwork><![CDATA[
x.store.book[0].title
]]></artwork></figure>

<t>or, in bracket notation,</t>

<figure><artwork><![CDATA[
x['store']['book'][0]['title']
]]></artwork></figure>

<t>with the variable x holding the argument.</t>

<t>The JSONPath language was designed to:</t>

<t><list style="symbols">
  <t>be naturally based on those language characteristics;</t>
  <t>cover only the most essential parts of XPath 1.0;</t>
  <t>be lightweight in code size and memory consumption;</t>
  <t>be runtime efficient.</t>
</list></t>

<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 <spanx style="verb">$</spanx> to refer to the root node of the argument, similar
to XPath's <spanx style="verb">/</spanx> at the front.</t>

<t>JSONPath expressions move further down the hierarchy using <em>dot notation</em>
(<spanx style="verb">$.store.book[0].title</spanx>)
or the <em>bracket notation</em>
(<spanx style="verb">$['store']['book'][0]['title']</spanx>), a lightweight/limited, and a more
heavyweight syntax replacing XPath's <spanx style="verb">/</spanx> within query expressions.</t>

<t>Both JSONPath and XPath use <spanx style="verb">*</spanx> for a wildcard.
The descendant operator <spanx style="verb">..</spanx>, borrowed from <xref target="E4X"/>, is similar to XPath's <spanx style="verb">//</spanx>.
The array slicing construct <spanx style="verb">[start:end:step]</spanx> is unique to JSONPath,
inspired by <xref target="SLICE"/> from ECMASCRIPT 4.</t>

<t>Filter expressions are supported via the syntax <spanx style="verb">?(&lt;boolean expr&gt;)</spanx> as in</t>

<figure><artwork><![CDATA[
$.store.book[?(@.price < 10)].title
]]></artwork></figure>

<t><xref target="tbl-xpath-overview"/> extends <xref target="tbl-overview"/> by providing a comparison
with similar XPath concepts.</t>

<texttable title="XPath syntax compared to JSONPath" anchor="tbl-xpath-overview">
      <ttcol align='left'>XPath</ttcol>
      <ttcol align='left'>JSONPath</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">/</spanx></c>
      <c><spanx style="verb">$</spanx></c>
      <c>the root XML element</c>
      <c><spanx style="verb">.</spanx></c>
      <c><spanx style="verb">@</spanx></c>
      <c>the current XML element</c>
      <c><spanx style="verb">/</spanx></c>
      <c><spanx style="verb">.</spanx> or <spanx style="verb">[]</spanx></c>
      <c>child operator</c>
      <c><spanx style="verb">..</spanx></c>
      <c>n/a</c>
      <c>parent operator</c>
      <c><spanx style="verb">//</spanx></c>
      <c><spanx style="verb">..</spanx></c>
      <c>descendants (JSONPath borrows this syntax from E4X)</c>
      <c><spanx style="verb">*</spanx></c>
      <c><spanx style="verb">*</spanx></c>
      <c>wildcard: All XML elements regardless of their names</c>
      <c><spanx style="verb">@</spanx></c>
      <c>n/a</c>
      <c>attribute access: JSON values do not have attributes</c>
      <c><spanx style="verb">[]</spanx></c>
      <c><spanx style="verb">[]</spanx></c>
      <c>subscript operator used to iterate over XML element collections and for predicates</c>
      <c><spanx style="verb">¦</spanx></c>
      <c><spanx style="verb">[,]</spanx></c>
      <c>Union operator (results in a combination of node sets); called list operator in JSONPath, allows combining member names, array indices, and slices</c>
      <c>n/a</c>
      <c><spanx style="verb">[start:end:step]</spanx></c>
      <c>array slice operator borrowed from ES4</c>
      <c><spanx style="verb">[]</spanx></c>
      <c><spanx style="verb">?()</spanx></c>
      <c>applies a filter (script) expression</c>
      <c>seamless</c>
      <c>n/a</c>
      <c>expression engine</c>
      <c><spanx style="verb">()</spanx></c>
      <c>n/a</c>
      <c>grouping</c>
</texttable>

<!-- 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>

<texttable title="Example XPath expressions and their JSONPath equivalents" anchor="tbl-xpath-equivalents">
      <ttcol align='left'>XPath</ttcol>
      <ttcol align='left'>JSONPath</ttcol>
      <ttcol align='left'>Result</ttcol>
      <c><spanx style="verb">/store/book/author</spanx></c>
      <c><spanx style="verb">$.store.book[*].author</spanx></c>
      <c>the authors of all books in the store</c>
      <c><spanx style="verb">//author</spanx></c>
      <c><spanx style="verb">$..author</spanx></c>
      <c>all authors</c>
      <c><spanx style="verb">/store/*</spanx></c>
      <c><spanx style="verb">$.store.*</spanx></c>
      <c>all things in store, which are some books and a red bicycle</c>
      <c><spanx style="verb">/store//price</spanx></c>
      <c><spanx style="verb">$.store..price</spanx></c>
      <c>the prices of everything in the store</c>
      <c><spanx style="verb">//book[3]</spanx></c>
      <c><spanx style="verb">$..book[2]</spanx></c>
      <c>the third book</c>
      <c><spanx style="verb">//book[last()]</spanx></c>
      <c><spanx style="verb">$..book[-1]</spanx></c>
      <c>the last book in order</c>
      <c><spanx style="verb">//book[position()&lt;3]</spanx></c>
      <c><spanx style="verb">$..book[0,1]</spanx><br /><spanx style="verb">$..book[:2]</spanx></c>
      <c>the first two books</c>
      <c><spanx style="verb">//book[isbn]</spanx></c>
      <c><spanx style="verb">$..book[?(@.isbn)]</spanx></c>
      <c>filter all books with isbn number</c>
      <c><spanx style="verb">//book[price&lt;10]</spanx></c>
      <c><spanx style="verb">$..book[?(@.price&lt;10)]</spanx></c>
      <c>filter all books cheaper than 10</c>
      <c><spanx style="verb">//*</spanx></c>
      <c><spanx style="verb">$..*</spanx></c>
      <c>all elements in XML document; all member values and array elements contained in input value</c>
</texttable>

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

<t><list style="symbols">
  <t>Square brackets in XPath expressions always operate on the <em>node
set</em> resulting from the previous path fragment. Indices always start
at 1.</t>
  <t>With JSONPath, square brackets operate on the <em>object</em> or <em>array</em>
addressed by the previous path fragment. Array indices always start
at 0.</t>
</list></t>

</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 document whose
structure is known.</t>

<t>JSONPath can identify a single value within a JSON document, 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 documents 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 document. The inverse is not generally true: a numeric
path component in a JSON Pointer may identify a member of a JSON object or may index an array.
For conversion to a JSONPath query, knowledge of the structure of the JSON document is
needed to distinguish these cases.</t>

</section>
<section numbered="no" anchor="acknowledgements"><name>Acknowledgements</name>

<t>This specification 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
 -->

</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>
          <street></street>
          <city>Pisa</city>
          <region></region>
          <code></code>
          <country>IT</country>
        </postal>
        <phone></phone>
        <email>mmikulicic@gmail.com</email>
      </address>
    </contact>
    <contact initials="E." surname="Surov" fullname="Edward Surov">
      <organization>TheSoul Publishing Ltd.</organization>
      <address>
        <postal>
          <street></street>
          <city>Limassol</city>
          <region></region>
          <code></code>
          <country>Cyprus</country>
        </postal>
        <phone></phone>
        <email>esurov.tsp@gmail.com</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA91923bbRrbgO76imklHpEJCJCX5QluOFVmO1ePbsZwTn6No
hSAJSohJgAFAyWpJveYj5n3mYdb5hPMBp/9kvmT2rQpVACjJSTq9ZrgSiwSq
du3aVbVr175Vp9PxzgZq0/MmyTgO5uFATdJgmneiMJ92fs6SeBHkp51RkIWd
7rY3DvKByvKJN07iLIyzZTZQa3m6DNe8bDmaR1kWJXF+sQAwB/vvn3veLIhP
BiqMvUU08JTKk7GpQL8m4SI/hUdb+Du7mKfhNLNKZEmalx6Nk/k8jHN4hE+8
PMpn0FrjL4dvXr8NENa/LMP0QoWfFmlI6GRqmqQK3ze8YDRKQ+ivLu0FaRgM
1O679975SfFY/fCd9/Gcf3uTIIcG+t1+3/OCZX6apAOvA4ikCTYcTqI8SeEn
E+8wD6dBrL77+39mWRzi8yQFwM+D8elpMj7NxqfLWaieQbfmy3iC3Ynyi4Hz
IJkAnGedra3e5kMkARAgBKofJnEMFM/T4O//M1QP71HRZZynUP27MJ0H8QU8
CudBNMMhQjT8kyQkNJ5OTzsTacKfhKvR/252EavXSTqP4pM8iTX6a2sWIvSD
0f4hisenITSGENLwBKit31Mv5Ktg+f1/g1+L0yTWbwTZE2jUj02jT0/wsQ/j
vBrPvSCFVmP1bYIdN3h+H0dnYZpF+d//d66+TUOYKOr9vx/w6yAbR5FVJghL
ZXQH3yZZPoUBU5ub3a2truktF7aGqP9gc/th/ThIN7/eetjZ6vc6/d6Dzr3N
h/1e0etxMEqe5n+NfEDNw/WUp9FomevZxf18FaQfE/Uq+ricReNorPt5EE9n
y0/Pgjxow/exXz86b6MsuMu4HLyvH5f5XLdbGhLGbX9yHqQTdbhMkzON2PvT
8DBZztTb5WgWZacwoOplPlmB38toHmRZMrsLjnsXi3SZ1eMZZoiCn2cLC08v
iqc4OXIY7YH3hVLvnu9tbm/3YW2EY+Re8uxBr39voKIgDughPbv3sNsbqEUS
xTyzax5pTtFJ0ugEORtwsyA9wR6e5vkiG2xs6MXnx2G+EaR5NJ6F2cZfgKVi
xQ2uw9zL8J3/89//h/pA3zTPomKa7Sj6rOI0+LmF2yiluVn3fqfb79CE/MB8
84fNPf/d/l7nE3L8frfT7/a6vX5vC0rsb30Y2Pg+kdYONI2TWOXh+DROZsnJ
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
AcS4bKAKbHlH0JfReHS+/L/8VTZ6c/sAAA==

-->

</rfc>

