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


<!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-06" 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 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>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>Type:</dt>
  <dd>
    <t>As per <xref target="RFC8259"/>, one of the six JSON types (strings, numbers, booleans, null, objects, arrays).</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 <!-- should we make it clear that names are (Unicode) strings? -->
"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 of 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>Unicode Scalar Value:</dt>
  <dd>
    <t>Any Unicode <xref target="UNICODE"/> code point except high-surrogate and low-surrogate code points.
In other words, base 16 integers in either of the inclusive ranges 0 to D7FF and
E000 to 10FFFF. JSON values of type string are sequences of Unicode scalar values.</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 operators (which start with <spanx style="verb">..</spanx>) select some or all of the descendants (<xref target="descendant-selectors"/>) 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">..name</spanx> <br /> <spanx style="verb">..[3]</spanx></c>
      <c>descendants: <xref target="descendant-selectors">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"/>, 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 an 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 member values and array elements contained in input value</c>
</texttable>

</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 JSON value.</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>

<t>The JSON value the JSONPath query is applied to is, by definition, a valid JSON value.
The parsing of a JSON text into a JSON value and what happens if a JSON
text does not represent valid JSON are not defined by this specification.</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      /
                               filter-selector     /
                               list-selector       /
                               descendant-selector))
]]></sourcecode></figure>

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

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

<t>In this specification, the semantics of a JSONPath query define the
required results and do not prescribe the internal workings of an
implementation.</t>

<t>The semantics are that 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 presented to 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 to produce
the result of the selector. A node may be selected more than once and
appear that number of times in the nodelist. Duplicate nodes are not removed.</t>

<t>The processing within a selector may execute nested queries,
which conform to the semantics 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>

<t>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>Consider this example. 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).</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>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>
  <t>Descendants selectors starting with a double dot <spanx style="verb">..</spanx></t>
</list></t>

<t>Note that processing the dot selector, string-valued index selector,
and filter selector all potentially require matching strings against
strings, with those strings coming from the JSONPath and from member
names and string values in the JSON to which it is being applied.
Two strings <bcp14>MUST</bcp14> be considered equal if and only if they are identical
sequences of Unicode scalar values. In other words, normalization operations
<bcp14>MUST NOT</bcp14> be applied to either the string from the JSONPath or from the JSON
prior to comparison.</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 root selector <spanx style="verb">$</spanx> selects the root node of the argument
and produces a nodelist consisting of that root node.</t>

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

<t>JSON:</t>

<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:</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    = "." wildcard       ;  dot followed by asterisk
wildcard             = "*"
]]></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 (a number,
a string, <spanx style="verb">true</spanx>, <spanx style="verb">false</spanx>, or <spanx style="verb">null</spanx>) selects no node.</t>

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

<t>JSON:</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>The <spanx style="verb">index-selector</spanx> applied with an <spanx style="verb">element-index</spanx> to an array selects an 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.
Nothing is selected, and it is not an error, if the index lies outside the range of the array. Nothing is selected from a value that is not an array.</t>

<t>A negative <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>

<!-- EDITING NOTE: There are non-breaking spaces here between j and j -->
<!-- i.e., j j and not j j -->

<t>JSON:</t>

<figure><artwork><![CDATA[
{
  "o": {"j j": {"k.k": 3}},
  "a": ["a","b"],
  "'": {"@": 2}
}
]]></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 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 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>
      <c><spanx style="verb">$["'"]["@"]</spanx></c>
      <c><spanx style="verb">2</spanx></c>
      <c><spanx style="verb">$['\'']['@']</spanx></c>
      <c>Unusual member names</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    = "[" wildcard "]"  ;  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 (that is,
a number, a string, <spanx style="verb">true</spanx>, <spanx style="verb">false</spanx>, or <spanx style="verb">null</spanx>) 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:</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 behavior 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 behavior of Python, which
raises an error in this case.)</t>

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

</section>
<section numbered="false" toc="exclude" anchor="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:</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="filter-selector"><name>Filter Selector</name>

<section numbered="false" toc="exclude" anchor="syntax-6"><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 the 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 boolean expression yields true.</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        = [logical-not-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        = [logical-not-op S] "(" S boolean-expr S ")"
                                                      ; parenthesized expression
logical-not-op    = "!"                               ; logical 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 (that is, numbers, strings, <spanx style="verb">true</spanx>, <spanx style="verb">false</spanx>,
and <spanx style="verb">null</spanx>).</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>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-6"><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>

<section numbered="false" toc="exclude" anchor="existence-tests"><name>Existence Tests</name>

<t>A singular path by itself in a Boolean context is an existence test which yields true if the path selects a node and yields false if the path does not select a node.
This existence test — as an exception to the general rule — also works with nodes with structured values.</t>

<t>To test the value of a node selected by a path, an explicit comparison is necessary.
For example, to test whether the node selected by the path <spanx style="verb">@.foo</spanx> has the value <spanx style="verb">null</spanx>, use <spanx style="verb">@.foo == null</spanx> (see <xref target="null-semantics"/>)
rather than the negated existence test <spanx style="verb">!@.foo</spanx> (which yields false if <spanx style="verb">@.foo</spanx> selects a node, regardless of the node's value).</t>

</section>
<section numbered="false" toc="exclude" anchor="comparisons"><name>Comparisons</name>

<t>When a path resulting in an empty nodelist appears on either side of a comparison, the comparison yields
true if and only if:</t>

<t><list style="symbols">
  <t>the comparison operator is <spanx style="verb">==</spanx>, <spanx style="verb">&gt;=</spanx> or <spanx style="verb">&lt;=</spanx> and the other side of the comparison is also a path
resulting in an empty nodelist, or</t>
  <t>the comparison operator is <spanx style="verb">!=</spanx> and the other side of the comparison is not also a path resulting in an empty nodelist.</t>
</list></t>

<t>When any path on either side of a comparison results in a nodelist consisting of a single node, each such path is
replaced by the value of its node and then:</t>

<t><list style="symbols">
  <t>a comparison using the operator <spanx style="verb">==</spanx> yields true if and only if the comparison
is between:
  <list style="symbols">
      <t>values of the same primitive type (numbers, strings, booleans, and <spanx style="verb">null</spanx>) which are equal,</t>
      <t>equal arrays, that is arrays of the same length where each element of the first array yields true when
compared using <spanx style="verb">==</spanx> to the corresponding element of the second array, or</t>
      <t>equal objects, that is objects where:
      <list style="symbols">
          <t>for each member of the first object with name <spanx style="verb">n</spanx> and value <spanx style="verb">v</spanx>, there is a member of the second object
with name <spanx style="verb">n</spanx> and value <spanx style="verb">w</spanx> where <spanx style="verb">v</spanx> and <spanx style="verb">w</spanx> yield true when comparsed using <spanx style="verb">==</spanx>, and</t>
          <t>for each member of the second object with name <spanx style="verb">n</spanx> and value <spanx style="verb">v</spanx>, there is a member of the first object
with name <spanx style="verb">n</spanx> and value <spanx style="verb">w</spanx> where <spanx style="verb">v</spanx> and <spanx style="verb">w</spanx> yield true when comparsed using <spanx style="verb">==</spanx>.</t>
        </list></t>
    </list></t>
  <t>a comparison using the operator <spanx style="verb">!=</spanx> yields true if and only if the comparison
is not between equal values of the same type.</t>
  <t>a comparison using one of the operators <spanx style="verb">&lt;</spanx>, <spanx style="verb">&lt;=</spanx>, <spanx style="verb">&gt;</spanx>, or <spanx style="verb">&gt;=</spanx> yields true if and only if
the comparison is between values of the same type which are both numbers or both strings and which satisfy the comparison:  <list style="symbols">
      <t>numbers in the I-JSON <xref target="RFC7493"/> range of exact values <bcp14>MUST</bcp14> compare using the normal mathematical ordering;
one or both numbers outside that range <bcp14>MAY</bcp14> compare using an implementation specific ordering</t>
      <t>the empty string compares less than any non-empty string</t>
      <t>a non-empty string compares less than another non-empty string if and only if the first string starts with a
lower Unicode scalar value than the second string or if both strings start with the same Unicode scalar value and
the remainder of the first string compares less than the remainder of the second string.</t>
    </list></t>
</list></t>

<t>Note that comparisons using any of the operators <spanx style="verb">&lt;</spanx>, <spanx style="verb">&lt;=</spanx>, <spanx style="verb">&gt;</spanx>, or <spanx style="verb">&gt;=</spanx> yield false if either value being
compared is an object, array, boolean, or <spanx style="verb">null</spanx>.</t>

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

<t>JSON:</t>

<figure><artwork><![CDATA[
{
  "obj": {"x": "y"},
  "arr": [2, 3]
}
]]></artwork></figure>

<texttable title="Comparison examples">
      <ttcol align='center'>Comparison</ttcol>
      <ttcol align='center'>Result</ttcol>
      <ttcol align='center'>Comment</ttcol>
      <c><spanx style="verb">$.nosuch1 == $.nosuch2</spanx></c>
      <c>true</c>
      <c>Empty nodelists</c>
      <c><spanx style="verb">$.nosuch1 == 'g'</spanx></c>
      <c>false</c>
      <c>Empty nodelist</c>
      <c><spanx style="verb">$.nosuch1 != $.nosuch2</spanx></c>
      <c>false</c>
      <c>Empty nodelists</c>
      <c><spanx style="verb">$.nosuch1 != 'g'</spanx></c>
      <c>true</c>
      <c>Empty nodelist</c>
      <c><spanx style="verb">1 &lt;= 2</spanx></c>
      <c>true</c>
      <c>Numeric comparison</c>
      <c><spanx style="verb">1 &gt; 2</spanx></c>
      <c>false</c>
      <c>Strict, numeric comparison</c>
      <c><spanx style="verb">13 == '13'</spanx></c>
      <c>false</c>
      <c>Type mismatch</c>
      <c><spanx style="verb">'a' &lt;= 'b'</spanx></c>
      <c>true</c>
      <c>String comparison</c>
      <c><spanx style="verb">'a' &gt; 'b'</spanx></c>
      <c>false</c>
      <c>Strict, string comparison</c>
      <c><spanx style="verb">$.obj == $.arr</spanx></c>
      <c>false</c>
      <c>Type mismatch</c>
      <c><spanx style="verb">$.obj != $.arr</spanx></c>
      <c>true</c>
      <c>Type mismatch</c>
      <c><spanx style="verb">$.obj == $.obj</spanx></c>
      <c>true</c>
      <c>Object comparison</c>
      <c><spanx style="verb">$.obj != $.obj</spanx></c>
      <c>false</c>
      <c>Object comparison</c>
      <c><spanx style="verb">$.arr == $.arr</spanx></c>
      <c>true</c>
      <c>Array comparison</c>
      <c><spanx style="verb">$.arr != $.arr</spanx></c>
      <c>false</c>
      <c>Array comparison</c>
      <c><spanx style="verb">$.obj == 17</spanx></c>
      <c>false</c>
      <c>Type mismatch</c>
      <c><spanx style="verb">$.obj != 17</spanx></c>
      <c>true</c>
      <c>Type mismatch</c>
      <c><spanx style="verb">$.obj &lt;= $.arr</spanx></c>
      <c>false</c>
      <c>Objects and arrays are not ordered</c>
      <c><spanx style="verb">$.obj &lt; $.arr</spanx></c>
      <c>false</c>
      <c>Objects and arrays are not ordered</c>
      <c><spanx style="verb">$.obj &lt;= $.obj</spanx></c>
      <c>false</c>
      <c>Objects are not ordered</c>
      <c><spanx style="verb">$.arr &lt;= $.arr</spanx></c>
      <c>false</c>
      <c>Arrays are not ordered</c>
      <c><spanx style="verb">1 &lt;= $.arr</spanx></c>
      <c>false</c>
      <c>Arrays are not ordered</c>
      <c><spanx style="verb">1 &gt;= $.arr</spanx></c>
      <c>false</c>
      <c>Arrays are not ordered</c>
      <c><spanx style="verb">1 &gt; $.arr</spanx></c>
      <c>false</c>
      <c>Arrays are not ordered</c>
      <c><spanx style="verb">1 &lt; $.arr</spanx></c>
      <c>false</c>
      <c>Arrays are not ordered</c>
      <c><spanx style="verb">true &lt;= true</spanx></c>
      <c>false</c>
      <c>Booleans are not ordered</c>
      <c><spanx style="verb">true &gt; true</spanx></c>
      <c>false</c>
      <c>Booleans are not ordered</c>
</texttable>

</section>
</section>
<section numbered="false" toc="exclude" anchor="regular-expressions"><name>Regular Expressions</name>

<t>A regular-expression test yields true if and only if the value on the left-hand side of <spanx style="verb">=~</spanx> is a string value and it
matches the regular expression on the right-hand side according to the semantics of <xref target="I-D.draft-bormann-jsonpath-iregexp"/>.</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="boolean-operators"><name>Boolean Operators</name>

<t>The logical AND, OR, and NOT operators have the normal semantics of Boolean algebra and
consequently obey these laws (where <spanx style="verb">P</spanx>, <spanx style="verb">Q</spanx>, and <spanx style="verb">R</spanx> are any expressions with syntax
<spanx style="verb">logical-and-expr</spanx>, <spanx style="verb">T</spanx> is any expression that yields true, such as <spanx style="verb">1 == 1</spanx>, and <spanx style="verb">F</spanx> is any expression that yields false,
such as <spanx style="verb">1 == 0</spanx>):</t>

<texttable title="Logical operator laws">
      <ttcol align='center'>Law</ttcol>
      <ttcol align='center'>Expression</ttcol>
      <ttcol align='center'>Equivalent expression</ttcol>
      <c>Associativity of OR</c>
      <c><spanx style="verb">P || (Q || R)</spanx></c>
      <c><spanx style="verb">(P || Q) || R</spanx></c>
      <c>Associativity of AND</c>
      <c><spanx style="verb">P &amp;&amp; (Q &amp;&amp; R)</spanx></c>
      <c><spanx style="verb">(P &amp;&amp; Q) &amp;&amp; R</spanx></c>
      <c>Commutativity of OR</c>
      <c><spanx style="verb">P || Q</spanx></c>
      <c><spanx style="verb">Q || R</spanx></c>
      <c>Commutativity of AND</c>
      <c><spanx style="verb">P &amp;&amp; Q</spanx></c>
      <c><spanx style="verb">Q &amp;&amp; R</spanx></c>
      <c>Distributivity of OR over AND</c>
      <c><spanx style="verb">P || (Q &amp;&amp; R)</spanx></c>
      <c><spanx style="verb">(P || Q) &amp;&amp; (P || R)</spanx></c>
      <c>Distributivity of AND over OR</c>
      <c><spanx style="verb">P &amp;&amp; (Q || R)</spanx></c>
      <c><spanx style="verb">(P &amp;&amp; Q) || (P &amp;&amp; R)</spanx></c>
      <c>Identity for OR</c>
      <c><spanx style="verb">P || F</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>Identity for AND</c>
      <c><spanx style="verb">P &amp;&amp; T</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>Annihilator for OR</c>
      <c><spanx style="verb">P || T</spanx></c>
      <c><spanx style="verb">T</spanx></c>
      <c>Annihilator for AND</c>
      <c><spanx style="verb">P &amp;&amp; F</spanx></c>
      <c><spanx style="verb">F</spanx></c>
      <c>Idempotence of OR</c>
      <c><spanx style="verb">P || P</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>Idempotence of AND</c>
      <c><spanx style="verb">P &amp;&amp; P</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>Absorption 1</c>
      <c><spanx style="verb">P &amp;&amp; (P || Q)</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>Absorption 2</c>
      <c><spanx style="verb">P || (P &amp;&amp; Q)</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>Complementation 1</c>
      <c><spanx style="verb">P &amp;&amp; !(P)</spanx></c>
      <c><spanx style="verb">F</spanx></c>
      <c>Complementation 2</c>
      <c><spanx style="verb">P || !(P)</spanx></c>
      <c><spanx style="verb">T</spanx></c>
      <c>Double negation</c>
      <c><spanx style="verb">!(!(P))</spanx></c>
      <c><spanx style="verb">P</spanx></c>
      <c>De Morgan 1</c>
      <c><spanx style="verb">!(P) &amp;&amp; !(Q)</spanx></c>
      <c><spanx style="verb">!(P || Q)</spanx></c>
      <c>De Morgan 2</c>
      <c><spanx style="verb">!(P) || !(Q)</spanx></c>
      <c><spanx style="verb">!(P &amp;&amp; Q)</spanx></c>
</texttable>

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

<t>JSON:</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>
      <c><spanx style="verb">$.a[?(@.b == $.x)]</spanx></c>
      <c><spanx style="verb">3</spanx> <br /> <spanx style="verb">5</spanx> <br /> <spanx style="verb">1</spanx> <br /> <spanx style="verb">2</spanx> <br /> <spanx style="verb">4</spanx> <br /> <spanx style="verb">6</spanx></c>
      <c><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'][3]</spanx> <br /> <spanx style="verb">$['a'][4]</spanx></c>
      <c>Comparison of paths with no values</c>
      <c><spanx style="verb">$[?(@ == @)]</spanx></c>
      <c>&#160;</c>
      <c>&#160;</c>
      <c>Comparison of structured values</c>
</texttable>

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

<t>The list selector allows combining member names, array indices,
slices, and filters 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-7"><name>Syntax</name>

<t>The list selector is syntactically related to the
<spanx style="verb">dot-selector</spanx>, <spanx style="verb">index-selector</spanx>, <spanx style="verb">slice-selector</spanx>, and the <spanx style="verb">filter-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-7"><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 nodelist.</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 <xref target="RFC7493"/> range of exact values, see
<xref target="synsem-overview"/>.</t>

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

<t>JSON:</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 anchor="descendant-selectors"><name>Descendant Selectors</name>

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

<t>The descendant selectors start 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>),
a wildcard (similar to the <spanx style="verb">dot-wild-selector</spanx>),
an <spanx style="verb">index-selector</spanx>, <spanx style="verb">index-wild-selector</spanx>, <spanx style="verb">filter-selector</spanx>, or <spanx style="verb">list-selector</spanx> acting on objects or arrays,
or a <spanx style="verb">slice-selector</spanx> acting on arrays.</t>

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

<t>Note that <spanx style="verb">..</spanx> on its own is not a valid selector.</t>

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

<t>A <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 that are member values of an object with the given member name.</t>
  <t>the <spanx style="verb">..[&lt;index&gt;]</spanx> form, where <spanx style="verb">&lt;index&gt;</spanx> is an <spanx style="verb">element-index</spanx>, selects those descendants that are array elements with the given index.</t>
  <t>the <spanx style="verb">..[&lt;slice-index&gt;]</spanx> form selects those descendants that are array elements selected by the given slice.</t>
  <t>the <spanx style="verb">..[&lt;filter&gt;]</spanx> form selects those descendants that are array elements or object values selected by the given filter.</t>
  <t>the <spanx style="verb">..[*]</spanx> and <spanx style="verb">..*</spanx> forms select all the descendants.</t>
</list></t>

<t>An <em>array-sequenced preorder</em> of the descendants of a node is a sequence of all the descendants in which:</t>

<t><list style="symbols">
  <t>nodes of any array appear in array order,</t>
  <t>nodes appear immediately before all their descendants.</t>
</list></t>

<t>This definition does not stipulate the order in which the children of an object appear, since JSON objects are unordered.</t>

<t>The resultant nodelist of a <spanx style="verb">descendant-selector</spanx> applied to a node must be a sub-sequence of an array-sequenced preorder of the descendants of the node.</t>

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

<t>JSON:</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">5</spanx> and <spanx style="verb">3</spanx> must appear before <spanx style="verb">{"j": 4}</spanx> and <spanx style="verb">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>
<section anchor="null-semantics"><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-10"><name>Examples</name>

<t>JSON:</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 value, there is a one to one correspondence between the value'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 texts.</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 value 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-11"><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>
      <c><spanx style="verb">$["\u000B"]</spanx></c>
      <c><spanx style="verb">$['\u000b']</spanx></c>
      <c>Unicode escape</c>
      <c><spanx style="verb">$["\u0061"]</spanx></c>
      <c><spanx style="verb">$['a']</spanx></c>
      <c>Unicode character</c>
      <c><spanx style="verb">$["\u00b1"]</spanx></c>
      <c><u format="char-num">$['±']</u></c>
      <c>Unicode character</c>
</texttable>

<t><spanx style="verb">$["\u00b1"]</spanx> is normalized into <contact fullname="$['±']"/> (noise in the
table and lack of typewriter font is due to RFCXMLv3 limitations).
<!-- Note that this cannot be put into typewriter font or into the -->
<!-- above table due to an RFCXMLv3 limitation. --></t>

</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 or arguments that trigger surprisingly high, possibly
exponential, CPU usage or, for example via a naive recursive implementation of the descendant selector,
stack overflow. Implementations need to have appropriate resource management
to mitigate these attacks.</t>

</section>
<section anchor="attacks-on-security-mechanisms-that-employ-jsonpath"><name>Attacks on Security Mechanisms that Employ JSONPath</name>

<t>Where JSONPath is used as a part of a security mechanism, attackers
can attempt to provoke unexpected or unpredictable behavior, or
take advantage of differences in behavior between JSONPath implementations.</t>

<t>Unexpected or unpredictable behavior can arise from an argument with certain
constructs described as unpredictable by <xref target="RFC8259"/>.
Predictable behavior can be expected, except in relation to the ordering
of objects, for any argument conforming with <xref target="RFC7493"/>.</t>

<t>Other attacks can target the behavior of underlying technologies such as UTF-8 (see
<xref section="10" sectionFormat="of" target="RFC3629"/>) and the Unicode character set.</t>

</section>
</section>


  </middle>

  <back>


    <references 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='25' month='April' 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-04'/>
   <format target='https://www.ietf.org/archive/id/draft-bormann-jsonpath-iregexp-04.txt' type='TXT'/>
</reference>


<reference anchor="UNICODE" target="https://www.unicode.org/versions/Unicode14.0.0/UnicodeStandard-14.0.pdf">
  <front>
    <title>The Unicode® Standard: Version 14.0 - Core Specification</title>
    <author >
      <organization>The Unicode Consortium</organization>
    </author>
    <date year="2021" month="September"/>
  </front>
  <format type="PDF" target="https://www.unicode.org/versions/Unicode14.0.0/UnicodeStandard-14.0.pdf"/>
</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' role='editor'/>
    <author fullname='Don Chamberlin' role='editor'/>
    <author fullname='Jerome Simeon' role='editor'/>
    <author fullname='Jonathan Robie' role='editor'/>
    <author fullname='Mary Fernandez' role='editor'/>
    <author fullname='Michael Kay' role='editor'/>
    <author fullname='Scott Boag' role='editor'/>
    <date day='14' month='December' year='2010'/>
  </front>
  <seriesInfo name='W3C REC' value='REC-xpath20-20101214'/>
  <seriesInfo name='W3C' value='REC-xpath20-20101214'/>
</reference>


<reference anchor="E4X" >
  <front>
    <title>Information technology — ECMAScript for XML (E4X) specification</title>
    <author >
      <organization>ISO</organization>
    </author>
    <date year="2006"/>
  </front>
  <seriesInfo name="ISO/IEC 22537:2006" value=""/>
</reference>
<reference anchor="SLICE" target="https://github.com/tc39/proposal-slice-notation">
  <front>
    <title>Slice notation</title>
    <author >
      <organization></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 analyze, transform and selectively extract data from
XML documents.
<xref target="XPath"/> is one of these tools.</t>

<t>In 2007, the need for something solving the same class of problems for
the emerging JSON community became apparent, specifically for:</t>

<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 operators, starting with <spanx style="verb">..</spanx>, borrowed from <xref target="E4X"/>, are 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">..name</spanx>, <spanx style="verb">..[index]</spanx>, <spanx style="verb">..*</spanx>, or <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 value whose
structure is known.</t>

<t>JSONPath can identify a single value within a JSON value, for example by
using a Normalized Path. But JSONPath is also a query syntax that can be used
to search for and extract multiple values from JSON values whose structure
is known only in a general way.</t>

<t>A Normalized JSONPath can be converted into a JSON Pointer by converting the syntax,
without knowledge of any JSON value. The inverse is not generally true: a numeric
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 value 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:
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
AQA=

-->

</rfc>

