JsonPath
JsonPath is based on Stefan Goessner’s JsonPath implementation (e1, e2, e3), and includes additional support for:
- multiple filters combined with logical operators && and ||
- regular expressions
JsonPath expressions
JsonPath expressions always refer to a JSON structure, in the same way as XPath expressions are used in combination with an XML document. The "root member object" in JsonPath is always referred to as $, regardless of whether it is an object or array.
JsonPath expressions can use the dot–notation:
$.store.book[0].title
or the bracket–notation:
$['store']['book'][0]['title']
Operators
| Operator | Description |
|---|---|
| $ | The root element to query. This starts all path expressions. |
| @ | The current node being processed by a filter predicate. |
| * | Wildcard. Available anywhere a name or numeric are required. |
| .. | Deep scan. Available anywhere a name is required. |
| .<name> | Dot-notated child. |
| ['<name>' (, '<name>')] | Bracket-notated child or children. |
| [<number> (, <number>)] | Array index or indexes. |
| [start:end] | Array slice operator. |
| [?(<expression>)] | Filter expression. Expression must evaluate to a Boolean value. |
Attributes
If a current node is array, use the length attribute to retrieve its length.
| Attribute | Description | Output |
|---|---|---|
| @.length | Provides the length of an array | Integer |
Filter Operators
Filters are logical expressions used to filter arrays. A typical filter would be
[?(@.age > 18)]
where @ represents the current item being processed.
More complex filters can be created with logical operators && and ||.
String literals must be enclosed by single or double quotes
([?(@.color == 'blue')] or [?(@.color == "blue")]).
| Operator | Description |
|---|---|
| == | left is equal to right (note that 1 is not equal to '1') |
| != | left is not equal to right |
| < | left is less than right |
| <= | left is less or equal to right |
| > | left is greater than right |
| >= | left is greater than or equal to right |
| =~ | left matches a regular expression (JavaScript style), for example: [?(@.name =~ /foo.*?/i)] |
Example
The following is an example of a simple JSON structure built after an XML example representing a bookstore.
{ "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
}
}
}| JsonPath | Result |
|---|---|
| $.store.book[*].author | The authors of all books in the store. |
| $..author | All authors. |
| $.store.* | All things in the store, which are some books and a red bicycle. |
| $.store..price | The price of everything in the store. |
| $..book[2] | The third book. |
$..book[(@.length-1)] $..book[-1:] | The last book in order. |
$..book[0,1] $..book[:2] | The first two books. |
| $..book[?(@.isbn)] | Filter all books with isbn number. |
| $..book[?(@.price<10)] | Filter all books cheaper than 10. |
| $..* | All elements in the XML document. All members of JSON structure. |
| $..book[?(@.author =~ /.*REES/i)] | All books matching regex (ignoring case). |

