JSONPath Syntax Reference
JSONPath is a query language for JSON that allows you to extract specific values from JSON documents. This page outlines the syntax and operators supported by Hyperbee.Json
.
JSONPath Overview
JSONPath operates on JSON documents:
- The special symbol
$
is used to reference the root JSON node. - The special symbol
@
is used to reference the current JSON node. - Queries can use dot-notation:
$.store.book[0].title
, or bracket-notation:$['store']['book'][0]['title']
- Filters may be used to conditionally include results:
$.store.book[?(@.price < 10)]
JSONPath Syntax
JSONPath | Description |
---|---|
$ | Root JSON node |
@ | Current JSON node |
.<name> , .'<name>' , or ."<name>" | Object member dot operator |
[<name>] , or ['<name>'] , or ["<name>"] | Object member subscript operator |
[<index] | Array access operator |
[,] | Union operator |
[start:end:step] | Array slice operator |
* , or [*] | Wildcard |
.. | Recursive descent |
?<expr> | Filter selector |
JSONPath Extended Syntax
The library extends the JSONPath expression syntax to support additional features.
Operators | Description | Example |
---|---|---|
+ - * \ % | Basic math operators. | $[?(@.a + @.b == 3)] |
in | Tests is a value is in a set. | $[?@.value in ['a', 'b', 'c'] ] |
JSONPath Operators
Root Node
$
is used as the root node identifier. $ refers to the entire JSON document, serving as the starting point for any JSONPath expression.
For instance, the expression $.store.book
would navigate from the root of the JSON document to the store object and then to the book array within that object.
Child Operator
.
is used to select the child elements of a given node. It helps to navigate through the JSON structure by accessing the properties of objects and elements of arrays directly from their parent nodes.
Expression | Description |
---|---|
$.store | Selects the store child of the root element. |
$.store.book | Selects the book child of the store element. |
$.store.book[0].title | Selects the title of the first book in store . |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": "value"
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book");
Console.WriteLine(result.First()); // Output: "value"
Subscript Operator
[]
Access Elements by Index.
Expression | Description |
---|---|
$[0] | Selects the first element of the array. |
$[-1] | Selects the last element of the array. |
$[1:3] | Selects the second and third elements of the array. |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
"value1",
"value2"
]
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[0]");
Console.WriteLine(result.First()); // Output: "value1"
Wildcard
[*]
Wildcard.
JSONPath | Description |
---|---|
$.* | Selects all children of the root element. |
$..book[*] | Selects all book elements regardless of their depth. |
$..* | Selects all elements and their children recursively. |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
"value1",
"value2"
]
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[*]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "value1"
// Output: "value2"
Descendant Search
..
Descendant Search.
Expression | Description |
---|---|
$..* | Selects all elements and their children recursively. |
$..author | Selects all author elements at any depth. |
$..store.book | Selects all book elements under store at any depth. |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
{
"category": "fiction"
},
{
"category": "science"
}
],
"bicycle": {
"category": "road"
}
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$..category");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "fiction"
// Output: "science"
// Output: "road"
Union
[ , ]
Select multiple items.
Filter Description | JSONPath Expression | Description |
---|---|---|
Selecting Multiple Keys | $[?(@.key1 == value1), (@.key2 == value2)] | Selects elements where key1 is value1 or key2 is value2 . |
Selecting Multiple Elements by Index | $[0, 2, 4] | Selects elements at index 0, 2, and 4. |
Selecting Multiple Nested Keys | $..['key1', 'key2'] | Selects all elements that have key1 or key2 at any level. |
Selecting Elements with Multiple Conditions | $[?(@.key1 == value1) || ?(@.key2 == value2)] | Selects elements where either key1 is value1 or key2 is value2 . |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
"value1",
"value2",
"value3"
]
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[0,2]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "value1"
// Output: "value3"
Slices
The syntax for a slice is: [start:end:step]
Each component is optional.
start
: The beginning index of the slice (inclusive). Defaults to 0 if omitted andstep
is positive, or the end of the sequence ifstep
is negative.stop
: The end index of the slice (exclusive). Defaults to the length of the sequence if omitted andstep
is positive, or the start of the sequence ifstep
is negative.step
: The interval between indices. Defaults to 1 if omitted.
Slice Expression Description
Slice Expression | Description |
---|---|
[start:stop] | Elements from start to stop-1 |
[start:] | Elements from start to the end of the sequence |
[:stop] | Elements from the start of the sequence to stop-1 |
[:] | All elements |
[start:stop:step] | Elements from start to stop-1 with a step of step |
Examples
Example | Description |
---|---|
$[-1] | Last element |
$[-2:] | Last two elements |
$[:-2] | All elements except the last two |
$[::-1] | All elements, in reverse |
$[1::-1] | First two elements, in reverse |
$[:-3:-1] | Last two elements, in reverse |
$[-3::-1] | All elements except the last two, in reverse |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
"value1",
"value2",
"value3",
"value4"
]
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[0:3:2]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "value1"
// Output: "value3"
Filters
Filter Expressions
?
Filter elements based on an expression.
JSONPath Filters
JSONPath filters allow you to query and manipulate JSON data structures by specifying conditions within square brackets []
. These filters enable you to select elements based on various criteria.
Basic Syntax
The general syntax for a JSONPath filter is:
$[?(@.key operator value)]
@
: Refers to the current element being processed.key
: The key within the JSON objects to apply the filter on.operator
: The comparison operator (e.g.,==
,!=
,>
,<
,>=
,<=
,in
,nin
).value
: The value to compare the key against.
Comparison Operators
Operator | Description |
---|---|
== | Equal to |
!= | Not equal to |
> | Greater than |
< | Less than |
>= | Greater than or equal to |
<= | Less than or equal to |
Examples
Filter Operator | Expression | Description |
---|---|---|
Equality | $[?(@.age == 30)] | Selects elements where the age key is equal to 30. |
Inequality | $[?(@.name != "John")] | Selects elements where the name key is not “John”. |
Greater Than | $[?(@.price > 20)] | Selects elements where the price key is greater than 20. |
Less Than | $[?(@.quantity < 5)] | Selects elements where the quantity key is less than 5. |
Combining Filters
Filters can be combined using logical operators &&
(and) and ||
(or).
Filter Operator | Expression | Description |
---|---|---|
Logical AND | $[?(@.price > 20 && @.quantity < 5)] | Selects elements where the price key is greater than 20 and the quantity key is less than 5. |
Logical OR | $[?(@.name == "John" || @.age > 30)] | Selects elements where the name key is “John” or the age key is greater than 30. |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
{
"price": 10
},
{
"price": 15
}
]
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[?@.price > 10]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: { "price": 15 }
Current Node
@
Current Node.
Expression | Description |
---|---|
$[?(@.price < 10)] | Selects elements with price less than 10. |
$[?(@.name)] | Selects elements that have a name key. |
$[?(@.age > 25)] | Selects elements with age greater than 25. |
using Hyperbee.JsonPath;
using System.Text.Json;
var json = """
{
"store": {
"book": [
{
"price": 10
},
{
"price": 15
}
]
}
}
""";
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[?(@.price > 10)]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: { "price": 15 }
More Examples
JSON Sample Document 1
{
"store": {
"book": [
{ "category": "fiction", "price": 10 },
{ "category": "science", "price": 15 }
]
}
}
Select all books:
using Hyperbee.JsonPath;
using System.Text.Json;
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[*]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: { "category": "fiction", "price": 10 }
// Output: { "category": "science", "price": 15 }
Select all categories:
using Hyperbee.JsonPath;
using System.Text.Json;
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[*].category");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "fiction"
// Output: "science"
Select books with price greater than 10:
using Hyperbee.JsonPath;
using System.Text.Json;
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.store.book[?@.price > 10]");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: { "category": "science", "price": 15 }
JSON Sample Document 2
{
"library": {
"books": [
{ "title": "Book 1", "details": { "author": "Author 1" } },
{ "title": "Book 2", "details": { "author": "Author 2" } }
]
}
}
Select all book titles:
using Hyperbee.JsonPath;
using System.Text.Json;
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.library.books[*].title");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "Book 1"
// Output: "Book 2"
Select all authors:
using Hyperbee.JsonPath;
using System.Text.Json;
var root = JsonDocument.Parse(json);
var result = JsonPath.Select(root, "$.library.books[*].details.author");
foreach (var item in result)
{
Console.WriteLine(item);
}
// Output: "Author 1"
// Output: "Author 2"
Additional Resources
- Stefan Goessner for the original JSONPath implementation.
- JSONPath Specification RFC 9535.