<?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.17 (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-07" 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/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/jsonpath/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-jsonpath/draft-ietf-jsonpath-base"/>.</t>
    </note>


  </front>

  <middle>


<!-- define an ALD to simplify below -->
<!-- use as {: unnumbered} -->

<!-- editorial issue: lots of complicated nesting of quotes, as in -->
<!-- `"13 == '13'"` or `$`.  We probably should find a simpler style -->

<section anchor="introduction"><name>Introduction</name>

<t>JSON <xref target="RFC8259"/> is a popular representation
format for structured data values.
JSONPath defines a string syntax for 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 children.</t>
  </dd>
  <dt>Descendants (of a node):</dt>
  <dd>
    <t>The children of the node, together with the children of its children, and so forth
recursively. More formally, the descendants relation between nodes is the transitive
closure of the children relation.</t>
  </dd>
  <dt>Depth (of a descendant node within a value):</dt>
  <dd>
    <t>The number of ancestors of the node within the value. The root node of the value has depth zero,
the children of the root node have depth one, their children have depth two, and so forth.</t>
  </dd>
  <dt>Segment:</dt>
  <dd>
    <t>One of the constructs which select children (<spanx style="verb">[]</spanx>)
or descendants (<spanx style="verb">..[]</spanx>) of an input value.</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, integers in either of the inclusive base 16 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 segments which each produce at most one node.</t>
  </dd>
  <dt>Selector:</dt>
  <dd>
    <t>A single item within a segment that takes the input value and produces a nodelist
consisting of child nodes of the input value.</t>
  </dd>
</dl>

<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 <contact fullname="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 use the <em>bracket notation</em>, for example:</t>

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

<t>or the more compact <em>dot notation</em>, for example:</t>

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

<t>to build paths that are input to a JSONPath implementation.
A single path may use a combination of bracket and dot notations.</t>

<t>Dot notation is merely a shorthand way of writing certain bracket notations.</t>

<t>A wildcard <spanx style="verb">*</spanx> (<xref target="wildcard"/>) in the expression <spanx style="verb">[*]</spanx> selects all children of an
object or an array and in the expression <spanx style="verb">..[*]</spanx> selects all descendants of an object or an array.</t>

<t>An array slice <spanx style="verb">start:end:step</spanx> (<xref target="slice"/>) selects a series of
elements 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.</t>

<t>Filter expressions <spanx style="verb">?&lt;boolean expr&gt;</spanx> select certain children of an object or array 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-identifier">root node identifier</xref></c>
      <c><spanx style="verb">@</spanx></c>
      <c><xref target="filter-selector">current node identifier</xref> (valid only within filter selectors)</c>
      <c><spanx style="verb">[&lt;selectors&gt;]</spanx></c>
      <c><xref target="child-segment">child segment</xref> selects zero or more children of JSON objects and arrays; contains one or more selectors, separated by commas</c>
      <c><spanx style="verb">..[&lt;selectors&gt;]</spanx></c>
      <c><xref target="descendant-segment">descendant segment</xref>: selects zero or more descendants of JSON objects and arrays; contains one or more selectors, separated by commas</c>
      <c><spanx style="verb">'name'</spanx></c>
      <c><xref target="name-selector">name selector</xref>: selects a named child of an object</c>
      <c><spanx style="verb">*</spanx></c>
      <c><xref target="name-selector">wildcard selector</xref>: selects all children of an array or object</c>
      <c><spanx style="verb">3</spanx></c>
      <c><xref target="index-selector">index selector</xref>: selects an indexed child of an array (from 0)</c>
      <c><spanx style="verb">0:100:5</spanx></c>
      <c><xref target="slice">array slice selector</xref>: start:end:step for arrays</c>
      <c><spanx style="verb">?&lt;expr&gt;</spanx></c>
      <c><xref target="filter-selector">filter selector</xref>: selects particular children using a boolean expression</c>
      <c><spanx style="verb">.name</spanx></c>
      <c>shorthand for <spanx style="verb">['name']</spanx></c>
      <c><spanx style="verb">.*</spanx></c>
      <c>shorthand for <spanx style="verb">[*]</spanx></c>
      <c><spanx style="verb">..name</spanx></c>
      <c>shorthand for <spanx style="verb">..['name']</spanx></c>
      <c><spanx style="verb">..*</spanx></c>
      <c>shorthand for <spanx style="verb">..[*]</spanx></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><xref target="tbl-example"/> shows some JSONPath queries that might be applied to this example and their intended results.</t>

<texttable title="Example JSONPath expressions and their intended results when applied to the example JSON value" anchor="tbl-example">
      <ttcol align='left'>JSONPath</ttcol>
      <ttcol align='left'>Intended 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-ietf-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 relating to the
well-formedness and the validity of a JSONPath query can be
raised during application of the query to a value.</t>

<t>Obviously, an implementation can still fail when executing a JSONPath
query, e.g., because of resource depletion, but this is not modeled in
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.
Sections <xref target="RFC8259" section="4" sectionFormat="bare"/> and <xref target="RFC8259" section="8" sectionFormat="bare"/> of <xref target="RFC8259"/> identify specific situations that may
conform to the grammar for JSON texts but are not interoperable uses
of JSON, for instance as they may cause unpredictable behavior.
The present specification does not attempt to define predictable
behavior for JSONPath queries in these situations.
(Note that another warning about interoperability, in <xref section="2" sectionFormat="of" target="RFC8259"/>, at the time of writing is generally considered to be overtaken
by events and causes no issues with the present specification.)</t>

<t>Specifically, the "Semantics" subsections of Sections
<xref format="counter" target="name-selector"/>, <xref format="counter" target="wildcard"/>,
<xref format="counter" target="filter-selector"/>, and <xref format="counter" target="descendant-segment"/> describe behavior that
turns unpredictable when the JSON value for one of the objects
under consideration was constructed out of JSON text that exhibits
multiple members for a single object that share the same member name
("duplicate names", see <xref section="4" sectionFormat="of" target="RFC8259"/>).
Also, selecting a child by name (<xref format="counter" target="name-selector"/>) and comparing strings
(<xref target="comparisons"/> in Section <xref format="counter" target="filter-selector"/>) assume these
strings are sequences of Unicode scalar values, turning unpredictable
if they aren't (<xref section="8.2" sectionFormat="of" target="RFC8259"/>).</t>

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

<t>Syntactically, a JSONPath query consists of a root identifier (<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>segments</em>.</t>

<figure><sourcecode type="abnf"><![CDATA[
json-path = root-identifier *(S (child-segment               /
                                 descendant-segment))
]]></sourcecode></figure>

<t>The syntax and semantics of each segment are 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 root identifier followed by a sequence of zero or more <em>segments</em>, each of
which is applied to the result of the previous root identifier or segment and provides
input to the next segment.
These results and inputs take the form of a <em>nodelist</em>, i.e., a
sequence of zero or more nodes.</t>

<t>The nodelist resulting from the root identifier contains a single node,
the argument.
The nodelist resulting from the last segment is presented as the
result of the query; depending on the specific API, it might be
presented as an array of the JSON values at the nodes, an array of
Normalized Paths referencing the nodes, or both — or some other
representation as desired by the implementation.
Note that the API must be capable of presenting an empty nodelist as
the result of the query.</t>

<t>A segment 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 segment. A node may be selected more than once and
appears that number of times in the nodelist. Duplicate nodes are not removed.</t>

<t>A syntactically valid segment <bcp14>MUST NOT</bcp14> produce errors when executing the query.
This means that some
operations that might be considered erroneous, such as 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 segments: <spanx style="verb">.a</spanx>, <spanx style="verb">[*]</spanx>, and <spanx style="verb">.b</spanx>.</t>

<t>Firstly, <spanx style="verb">$</spanx> produces a nodelist consisting of just the argument.</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 node 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 segments produces an empty nodelist,
then the whole query produces an empty nodelist.</t>

<t>In what follows, the semantics of each segment are defined for each type
of node. It will turn out that the more segments there are in a query, the greater the depth of the
nodes of the resultant nodelist in the input value:</t>

<t><list style="symbols">
  <t>A query with N segments, where N &gt;= 0, produces a nodelist
consisting of nodes at depth in the input value of N or greater.</t>
  <t>A query with N segments, where N &gt;= 0, all of which are <xref target="child-segment">child segments</xref>,
produces a nodelist consisting of nodes precisely at depth N in the input value.</t>
</list></t>

</section>
<section anchor="root-identifier"><name>Root Identifier</name>

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

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

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

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

<t>The root identifier <spanx style="verb">$</spanx> represents the root node of the argument
and produces a nodelist consisting of that root node.</t>

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

<t>JSON:</t>

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

<t>Queries:</t>

<texttable title="Root identifier 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="selectors"><name>Selectors</name>

<t>Selectors appear only inside <xref target="child-segment">child segments</xref> and
<xref target="descendant-segment">descendant segments</xref>.</t>

<t>A selector produces a nodelist consisting of zero or more children of the input value.</t>

<t>There are various kinds of selectors which produce children of objects, children or arrays,
or children of either objects or arrays.</t>

<figure><sourcecode type="abnf"><![CDATA[
selector =  ( name-selector  /
              index-selector /
              slice-selector /
              filter-selector
            )
]]></sourcecode></figure>

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

<section anchor="name-selector"><name>Name Selector</name>

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

<t>A name selector <spanx style="verb">'&lt;name&gt;'</spanx> selects at most one object member value.</t>

<t>Applying the <spanx style="verb">name-selector</spanx> to an object value in its input nodelist,
its string is required to match 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[
name-selector       = string-literal

string-literal      = %x22 *double-quoted %x22 /       ; "string"
                      %x27 *single-quoted %x27         ; 'string'

double-quoted       = unescaped /
                      %x27      /                       ; '
                      ESC %x22  /                       ; \"
                      ESC escapable

single-quoted       = unescaped /
                      %x22      /                       ; "
                      ESC %x27  /                       ; \'
                      ESC escapable

ESC                 = %x5C                              ; \  backslash

unescaped           = %x20-21 /                         ; 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>Note: <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"/>).</t>

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

<t>A <spanx style="verb">name-selector</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 name selector applied 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>Note that processing the name selector potentially requires 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>
<section numbered="false" toc="exclude" anchor="examples-1"><name>Examples</name>

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

<t>JSON:</t>

<figure><artwork><![CDATA[
{
  "o": {"j j": {"k.k": 3}},
  "'": {"@": 2}
}
]]></artwork></figure>

<t>Queries:</t>

<texttable title="Name 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">$["'"]["@"]</spanx></c>
      <c><spanx style="verb">2</spanx></c>
      <c><spanx style="verb">$['\'']['@']</spanx></c>
      <c>Unusual member names</c>
      <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>Wildcard Selector</name>

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

<t>The wildcard selector consists of an asterisk.</t>

<figure><sourcecode type="abnf"><![CDATA[
wildcard = "*"
]]></sourcecode></figure>

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

<t>A <spanx style="verb">wildcard</spanx> selector selects the nodes of all children of an object or array.</t>

<t>The <spanx style="verb">wildcard</spanx> selector selects nothing from 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>).</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>

<t>The following examples show the <spanx style="verb">wildcard</spanx> selector in use by a child segment.</t>

<texttable title="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">$[*]</spanx></c>
      <c><spanx style="verb">{"j": 1, "k": 2}</spanx> <br /> <spanx style="verb">[5, 3]</spanx></c>
      <c><spanx style="verb">$['o']</spanx> <br /> <spanx style="verb">$['a']</spanx></c>
      <c>Object values</c>
      <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> matches at most one array element value.</t>

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

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

<t>Applying the numerical <spanx style="verb">index-selector</spanx> selects the corresponding
element. JSONPath allows it to be negative (see <xref target="index-semantics"/>).</t>

<t>Notes:
1. An <spanx style="verb">index-selector</spanx> is an integer (in base 10, as in JSON numbers).
2. As in JSON numbers, the syntax does not allow octal-like integers with leading zeros such as <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>The <spanx style="verb">index-selector</spanx> applied to an array selects an array element using a zero-based index.
For example, the selector <spanx style="verb">0</spanx> selects the first and the 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">index-selector</spanx> counts from the array end.
For example, the selector <spanx style="verb">-1</spanx> selects the last and the 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[
["a","b"]
]]></artwork></figure>

<t>Queries:</t>

<t>The following examples show the index selector in use by a child segment.</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">$[1]</spanx></c>
      <c><spanx style="verb">"b"</spanx></c>
      <c><spanx style="verb">$[1]</spanx></c>
      <c>Member of array</c>
      <c><spanx style="verb">$[-2]</spanx></c>
      <c><spanx style="verb">"a"</spanx></c>
      <c><spanx style="verb">$[0]</spanx></c>
      <c>Member of array, from the end</c>
</texttable>

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

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

<t>The array slice selector has the form <spanx style="verb">&lt;start&gt;:&lt;end&gt;:&lt;step&gt;</spanx>.
It matches elements from arrays 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 =  [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 slice selector consists of three optional decimal integers separated by colons.</t>

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

<t>The slice selector was inspired by the slice operator of ECMAScript
4 (ES4), which was deprecated in 2014, and that of Python.</t>

<section numbered="false" toc="exclude" anchor="informal-introduction"><name>Informal Introduction</name>

<t>This section is non-normative.</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>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-4"><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-4"><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 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 (name-segment / index-segment))
abs-singular-path = root-identifier *(S (name-segment / index-segment))
name-segment      = "[" name-selector "]" / dot-member-name-shorthand
index-segment     = "[" 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-ietf-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-5"><name>Semantics</name>

<t>The filter selector works with arrays and objects exclusively. Its result is a list of <em>zero</em>, <em>one</em>, <em>multiple</em> or <em>all</em> of their array elements or member values, respectively.
Applied to 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>The comparison operators <spanx style="verb">==</spanx> and <spanx style="verb">&lt;</spanx> are defined first and then these are used to define <spanx style="verb">!=</spanx>, <spanx style="verb">&lt;=</spanx>, <spanx style="verb">&gt;</spanx>, and <spanx style="verb">&gt;=</spanx>.</t>

<t>When a path resulting in an empty nodelist appears on either side of a comparison:</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 two paths each of which result in an empty nodelist.</t>
  <t>a comparison using the operator <spanx style="verb">&lt;</spanx> yields false.</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 is equal to the corresponding
element of the second array, or</t>
      <t>equal objects with no duplicate names, that is where:
      <list style="symbols">
          <t>both objects have the same collection of names (with no duplicates), and</t>
          <t>for each of those names, the values associated with the name by the objects are equal.</t>
        </list></t>
    </list></t>
  <t>a comparison using the operator <spanx style="verb">&lt;</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 expected to interoperate as per <xref section="2.2" sectionFormat="of" target="RFC7493">I-JSON</xref> <bcp14>MUST</bcp14> compare using the normal mathematical ordering;
numbers not expected to interoperate as per I-JSON <bcp14>MAY</bcp14> compare using an implementation specific ordering</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 the operator <spanx style="verb">&lt;</spanx> yield false if either value being
compared is an object, array, boolean, or <spanx style="verb">null</spanx>.</t>

<t><spanx style="verb">!=</spanx>, <spanx style="verb">&lt;=</spanx>, <spanx style="verb">&gt;</spanx>, and <spanx style="verb">&gt;=</spanx> are defined in terms of the other comparison operators. For any <spanx style="verb">a</spanx> and <spanx style="verb">b</spanx>:</t>

<t><list style="symbols">
  <t>The comparison <spanx style="verb">a != b</spanx> yields true if and only if <spanx style="verb">a == b</spanx> yields false.</t>
  <t>The comparison <spanx style="verb">a &lt;= b</spanx> yields true if and only if <spanx style="verb">a &lt; b</spanx> yields true or <spanx style="verb">a == b</spanx> yields true.</t>
  <t>The comparison <spanx style="verb">a &gt; b</spanx> yields true if and only if <spanx style="verb">b &lt; a</spanx> yields true.</t>
  <t>The comparison <spanx style="verb">a &gt;= b</spanx> yields true if and only if <spanx style="verb">b &lt; a</spanx> yields true or <spanx style="verb">a == b</spanx> yields true.</t>
</list></t>

</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-ietf-jsonpath-iregexp"/>.</t>

<t>The semantics of regular expressions are as defined in <xref target="I-D.draft-ietf-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
obey its laws (see, for example, <xref target="BOOLEAN-LAWS"/>).</t>

</section>
</section>
<section numbered="false" toc="exclude" anchor="examples-5"><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">$.absent1 == $.absent2</spanx></c>
      <c>true</c>
      <c>Empty nodelists</c>
      <c><spanx style="verb">$.absent1 &lt;= $.absent2</spanx></c>
      <c>true</c>
      <c><spanx style="verb">==</spanx> implies <spanx style="verb">&lt;=</spanx></c>
      <c><spanx style="verb">$.absent == 'g'</spanx></c>
      <c>false</c>
      <c>Empty nodelist</c>
      <c><spanx style="verb">$.absent1 != $.absent2</spanx></c>
      <c>false</c>
      <c>Empty nodelists</c>
      <c><spanx style="verb">$.absent != '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>true</c>
      <c><spanx style="verb">==</spanx> implies <spanx style="verb">&lt;=</spanx></c>
      <c><spanx style="verb">$.arr &lt;= $.arr</spanx></c>
      <c>true</c>
      <c><spanx style="verb">==</spanx> implies <spanx style="verb">&lt;=</spanx></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>true</c>
      <c><spanx style="verb">==</spanx> implies <spanx style="verb">&lt;=</spanx></c>
      <c><spanx style="verb">true &gt; true</spanx></c>
      <c>false</c>
      <c>Booleans are not ordered</c>
</texttable>

<t>JSON:</t>

<figure><artwork><![CDATA[
{
  "a": [3, 5, 1, 2, 4, 6, {"b": "j"}, {"b": "k"}],
  "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": "j"}</spanx> <br /> <spanx style="verb">{"b": "k"}</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 == "k"]</spanx></c>
      <c><spanx style="verb">1</spanx> <br /> <spanx style="verb">{"b": "k"}</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": "j"}</spanx> <br /> <spanx style="verb">{"b": "k"}</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>
<section anchor="segments"><name>Segments</name>

<t>Segments apply one or more selectors to an input value and concatenate the results into a single nodelist.</t>

<t>The syntax and semantics of each segment are defined below.</t>

<section anchor="child-segment"><name>Child Segment</name>

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

<t>The child segment consists of a non-empty, comma-delimited
sequence of selectors enclosed in square brackets.</t>

<t>Shorthand notations are also provided for when there is a single
wildcard or name selector.</t>

<figure><sourcecode type="abnf"><![CDATA[
child-segment             = (child-longhand /
                             dot-wildcard-shorthand /
                             dot-member-name-shorthand)

child-longhand            = "[" S selector 1*(S "," S selector) S "]"

dot-wildcard-shorthand    = "." wildcard

dot-member-name-shorthand = "." 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>The <spanx style="verb">dot-wildcard-shorthand</spanx> is shorthand for <spanx style="verb">[*]</spanx>.</t>

<t>A <spanx style="verb">dot-member-name-shorthand</spanx> of the form <spanx style="verb">.&lt;member-name&gt;</spanx> is shorthand for <spanx style="verb">['&lt;member-name&gt;']</spanx>, but
can only be used with member names that are composed of certain characters.</t>

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

<t>A child segment contains a comma-delimited sequence of selectors, each of which
selects zero or more children of the input value.</t>

<t>Selectors of different kinds may be combined within a single child segment.</t>

<t>The resulting nodelist of a child segment is the concatenation of
the nodelists from each of its selectors in the order that the selectors
appear in the list.
Note that any node matched by more than one selector is kept
as many times in the nodelist.</t>

</section>
</section>
<section anchor="descendant-segment"><name>Descendant Segment</name>

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

<t>The descendant segment consists of a double dot <spanx style="verb">..</spanx>
followed by a child segment (<spanx style="verb">descendant-segment</spanx>).</t>

<t>Shortand notations are also provided that correspond to the shorthand forms of the child segment.</t>

<figure><sourcecode type="abnf"><![CDATA[
descendant-segment               = (descendant-child /
                                    descendant-wildcard-shorthand /
                                    descendant-member-name-shorthand)
descendant-child                 = ".." child-segment

descendant-wildcard-shorthand    = ".." wildcard
descendant-member-name-shorthand = ".." dot-member-name
]]></sourcecode></figure>

<t>The <spanx style="verb">descendant-wildcard-shorthand</spanx> is shorthand for <spanx style="verb">..[*]</spanx>.</t>

<t>A <spanx style="verb">descendant-member-name-shorthand</spanx> of the form <spanx style="verb">..&lt;member-name&gt;</spanx> is shorthand for <spanx style="verb">..['&lt;member-name&gt;']</spanx>.</t>

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

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

<!-- The following does not address https://github.com/ietf-wg-jsonpath/draft-ietf-jsonpath-base/issues/252 -->

<t>A descendant segment produces zero or more descendants of the input value.</t>

<t>A nodelist enumerating the descendants is known as a <em>descendant nodelist</em> when:</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 descendant segment of the form <spanx style="verb">..[&lt;selectors&gt;]</spanx> is the result of applying
the child segment <spanx style="verb">[&lt;selectors&gt;]</spanx> to a descendant nodelist.</t>

</section>
<section numbered="false" toc="exclude" anchor="examples-6"><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 segment 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> <br /> <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>
</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-7"><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>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-identifier *(normal-index-segment)
normal-index-segment      = "[" (normal-name-selector / normal-index-selector) "]"
normal-name-selector      = %x27 *normal-single-quoted %x27 ; 'string'
normal-single-quoted      = normal-unescaped /
                            ESC normal-escapable
normal-unescaped          = %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-index-selector     = "0" / (DIGIT1 *DIGIT) ; non-negative decimal integer
]]></sourcecode></figure>

<section numbered="false" toc="exclude" anchor="examples-8"><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-ietf-jsonpath-iregexp"/> for performance issues in regular
expression implementations.)
Implementers need to be aware that good average performance is not
sufficient as long as an attacker can choose to submit specially
crafted JSONPath queries or arguments that trigger surprisingly high, possibly
exponential, CPU usage or, for example via a naive recursive implementation of the descendant segment,
stack overflow. Implementations need to have appropriate resource management
to mitigate these attacks.</t>

</section>
<section anchor="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-ietf-jsonpath-iregexp'>
   <front>
      <title>I-Regexp: An Interoperable Regexp Format</title>
      <author fullname='Carsten Bormann' initials='C.' surname='Bormann'>
         <organization>Universität Bremen TZI</organization>
      </author>
      <author fullname='Tim Bray' initials='T.' surname='Bray'>
         <organization>Textuality</organization>
      </author>
      <date day='11' month='July' 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-ietf-jsonpath-iregexp-01'/>
   <format target='https://www.ietf.org/archive/id/draft-ietf-jsonpath-iregexp-01.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>


<reference anchor="BOOLEAN-LAWS" target="https://en.wikipedia.org/wiki/Boolean_algebra#Laws">
  <front>
    <title>Boolean algebra laws</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</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>
          <city>Pisa</city>
          <country>IT</country>
        </postal>
        <email>mmikulicic@gmail.com</email>
      </address>
    </contact>
    <contact initials="E." surname="Surov" fullname="Edward Surov">
      <organization>TheSoul Publishing Ltd.</organization>
      <address>
        <postal>
          <city>Limassol</city>
          <country>Cyprus</country>
        </postal>
        <email>esurov.tsp@gmail.com</email>
      </address>
    </contact>
    <contact initials="G." surname="Dennis" fullname="Greg Dennis">
      <organization></organization>
      <address>
        <postal>
          <city>Auckland</city>
          <country>New Zealand</country>
        </postal>
        <email>gregsdennis@yahoo.com</email>
        <uri>https://github.com/gregsdennis</uri>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
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
J+zBcYp3aLknXjJeoVyX8qEXLJdRLMwOp0m8CuhmYQ/1EPqW/UZpQevGlXZL
0QNvar5RiECSndBsntvS4cducOymLS61LW/5XUf1UMA3Xx35el9G7EnCBKRw
bcEFCtzHZcp2JqaKJhNzI8ZQK5O5ZAdBBHE3AzSR4Ls4cqXk0z5qZIx3Z9d4
ejKZcN5IdErlVFIuDYa5TmDx8v3RHiZ4VsZNtBm3ERGtLUwS9lLFjMWT7w6O
SMp7d3Dy/t2RijHf16vjA/cZ4uwv/OZoH+o6Mpjvr6j5prjluZtVXKs6Cax3
jCFkPRbWTFWdIrmilly8PrYqg/1Lb4u0P18+bTrtCYabuYz86eqja10mNWZT
EPX02qF5dgQWs7rbJqu0FhP9NQOvOal0pC3Qtbe2u/B5lWPnDIqEhMFtQl4S
NPyyQgovCPomDZcOYG1aKJYskp+Y7HccqpHSWIRK4HJw31Mz9Jbpyi5QQ1oM
8I56fXjUfL37Q1O6aavVlmlYCeRuKWraKWPoslpUGuz0uDT8XdAztekXE6IO
DL03qVqbu2lVThw121q9LOKmdGJIkOc7M5R3OVyCu4FP82g2SoecSxS3rLAZ
t/o2JInunnf2YNXVK9Kup2/ENXOmICeSH1L2AhqRmSs9VYCAGHBFkGJGyO8O
Xx3Ak23GwxYh9Pjg1cHeiUKY6DdWiIE5YEuCSqoXBDhZpOTSrNjtg1o0fTBu
tlX8xX247MjKZlD+LsHMaAJN3EDiWjm7yJUDwhV18+4sSm3+IMYTHKluUSAu
1q6Xoz/efsl1HynUVGOA/wzxnxH+E+E/Y/znzFe1/bH6sS25aCP9GF84AVCO
qkxfQq1ROebCtEa0lEHzZZrb3FqrNjiqa3C93CA1tKab4sOCtDWuaWvzrraM
AteFDk8O0uCZbdBpO/K7cdAhX50xGa3gQwcOF6aNEnwuIvV3Fx+rzhjK5ylP
2NmtU/eVVYov/WQN6rqcrOEz9IqlhA8llaJOEsFeo2n2MVeXcaj3S+RjmE2v
HP4u58ghbi5K8bDytIAlYNGM4BvU/UnuiA52LVxjn+NEeHu1NthiE1X/Ssfm
DREDD4zOGeex5itou8riNSowJdM4mqji6PL5xSCdUIodicYhHsJYy83vgm85
IbfJ+y7xYDho46UkEMNyuPFLZl8TsqYmSUbfHXxfDgQ6wAXlRXXvbaq2W3Vt
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

-->

</rfc>

