JSONPath was developed by Stefan Goessner as an analog for XPath for use with JSON data. The following description is modified from his description of how JSONPath works.
JSONPath expressions always refer to a JSON structure in the same way as XPath expression are used in combination with an XML document. Since a JSON structure is usually anonymous and doesn't necessarily have a "root member object" JSONPath assumes the abstract name $ assigned to the outer level object.
JSONPath expressions can use the dot notation
$.store.book[0].title
or the bracket notation
$['store']['book'][0]['title']
for input paths. Internal or output paths will always be converted to the more general bracket notation.
JSONPath allows the wildcard symbol * for member names and array indices. It borrows the descendant operator '..' from E4X and the | array slice syntax proposal [start:end:step] from ECMASCRIPT 4 proposal.
KRL expressions (<expr>) can be used as an alternative to explicit names or indices using the symbol '@' for the current object. Filter expressions are supported via the syntax ?(<boolean expr>) as in
$.store.book[?(@.price < 10)].title
Comparison to XPath
Here is a complete overview and a side by side comparison of the JSONPath syntax elements with its XPath counterparts.
XPath
JSONPath
Description
/
$
the root object/element
.
@
the current object/element
/
. or []
child operator
..
n/a
parent operator
//
..
recursive descent. JSONPath borrows this syntax from E4X.
*
*
wildcard. All objects/elements regardless their names.
@
n/a
attribute access. JSON structures don't have attributes.
[]
[]
subscript operator. XPath uses it to iterate over element collections and for predicates. In Javascript and JSON it is the native array operator.
|
[,]
Union operator in XPath results in a combination of node sets. JSONPath allows alternate names or array indices as a set.
n/a
[start:end:step]
array slice operator borrowed from ES4.
[]
?()
applies a filter (script) expression.
n/a
()
script expression, using the underlying script engine.
()
n/a
grouping in Xpath
XPath has a lot more to offer (Location pathes in not abbreviated syntax, operators and functions) than listed here. Moreover there is a remarkable difference how the subscript operator works in Xpath and JSONPath.
Square brackets in XPath expressions always operate on the node set resulting from the previous path fragment. Indices always start by 1.
With JSONPath square brackets operate on the object or array addressed by the previous path fragment. Indices always start by 0.
Examples
The following provides example JSONPath expressions. The object is a simple JSON structure built after an XML example representing a bookstore (original XML file).
{ "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
}
}
}
XPath
JSONPath
Result
/store/book/author
$.store.book[*].author
the authors of all books in the store
//author
$..author
all authors
/store/*
$.store.*
all things in store, which are some books and a red bicycle.
/store//price
$.store..price
the price of everything in the store.
//book[3]
$..book[2]
the third book
//book[last()]
$..book[-1:]
the last book in order.
//book[position()<3]
$..book[0,1] $..book[:2]
the first two books
//book[isbn]
$..book[?(@.isbn)]
filter all books with isbn number
//book[price<10]
$..book[?(@.price<10)]
filter all books cheapier than 10
//*
$..*
all Elements in XML document. All members of JSON structure.
JSONPath
JSONPath was developed by Stefan Goessner as an analog for XPath for use with JSON data. The following description is modified from his description of how JSONPath works.
JSONPath expressions always refer to a JSON structure in the same way as XPath expression are used in combination with an XML document. Since a JSON structure is usually anonymous and doesn't necessarily have a "root member object" JSONPath assumes the abstract name
$assigned to the outer level object.JSONPath expressions can use the dot notation
$.store.book[0].titleor the bracket notation
$['store']['book'][0]['title']for input paths. Internal or output paths will always be converted to the more general bracket notation.
JSONPath allows the wildcard symbol * for member names and array indices. It borrows the descendant operator '..' from E4X and the | array slice syntax proposal
[start:end:step]from ECMASCRIPT 4 proposal.KRL expressions
(<expr>)can be used as an alternative to explicit names or indices using the symbol '@' for the current object. Filter expressions are supported via the syntax?(<boolean expr>)as in$.store.book[?(@.price < 10)].titleComparison to XPath
Here is a complete overview and a side by side comparison of the JSONPath syntax elements with its XPath counterparts.
XPath has a lot more to offer (Location pathes in not abbreviated syntax, operators and functions) than listed here. Moreover there is a remarkable difference how the subscript operator works in Xpath and JSONPath.
Examples
The following provides example JSONPath expressions. The object is a simple JSON structure built after an XML example representing a bookstore (original XML file).
{ "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 } } }/store/book/author$.store.book[*].author//author$..author/store/*$.store.*/store//price$.store..price//book[3]$..book[2]//book[last()]$..book[-1:]//book[position()<3]$..book[0,1]$..book[:2]//book[isbn]$..book[?(@.isbn)]//book[price<10]$..book[?(@.price<10)]//*$..*