json.path.Path is a simple class implementing the JSONPath syntax for extracting
data out of a JSON tree.
While the semantics of the JSONPath expressions are heavily borrowed by the
XPath specification for XML, the syntax follows the ECMAScript origins of
JSON.
Once a json.path.Path instance has been created, it has to compile a JSONPath
expression using json.path.Path.compile before being able to match it to
a JSON tree; the same json.path.Path instance can be used to match multiple JSON
trees. It it also possible to compile a new JSONPath expression using the
same json.path.Path instance; the previous expression will be discarded only if
the compilation of the new expression is successful.
The simple convenience function json.path.Path.query can be used for
one-off matching.
A JSONPath expression is composed by path indices and operators.
Each path index can either be a member name or an element index inside
a JSON tree. A JSONPath expression must start with the $ operator; each
path index is separated using either the dot notation or the bracket
notation, e.g.:
The $ character represents the root node of the JSON tree, and
matches the entire document.
Child nodes can either be matched using . or []. For instance,
both $.store.book and $['store']['book'] match the contents of
the book member of the store object.
Child nodes can be reached without specifying the whole tree structure
through the recursive descent operator, or ... For instance,
$..author matches all author member in every object.
Child nodes can grouped through the wildcard operator, or *. For
instance, $.store.book[*].author matches all author members of any
object element contained in the book array of the store object.
Element nodes can be accessed using their index (starting from zero)
in the subscript operator []. For instance, $.store.book[0] matches
the first element of the book array of the store object.
Subsets of element nodes can be accessed using the set notation
operator [i,j,...]. For instance, $.store.book[0,2] matches the
elements 0 and 2 (the first and third) of the book array of the store
object.
Slices of element nodes can be accessed using the slice notation
operation [start:end:step]. If start is omitted, the starting index
of the slice is implied to be zero; if end is omitted, the ending index
of the slice is implied to be the length of the array; if step is
omitted, the step of the slice is implied to be 1. For instance,
$.store.book[:2] matches the first two elements of the book array
of the store object.
More information about JSONPath is available on Stefan Gössner's
JSONPath website.
The result node will contain an array with all values of the
author member of the objects in the JSON tree. If we use a
json.generator.Generator to convert the result node to a string
and print it:
json.path.Path is a simple class implementing the JSONPath syntax for extracting data out of a JSON tree.
While the semantics of the JSONPath expressions are heavily borrowed by the XPath specification for XML, the syntax follows the ECMAScript origins of JSON.
Once a json.path.Path instance has been created, it has to compile a JSONPath expression using json.path.Path.compile before being able to match it to a JSON tree; the same json.path.Path instance can be used to match multiple JSON trees. It it also possible to compile a new JSONPath expression using the same json.path.Path instance; the previous expression will be discarded only if the compilation of the new expression is successful.
The simple convenience function json.path.Path.query can be used for one-off matching.
Syntax of the JSONPath expressions
A JSONPath expression is composed by path indices and operators. Each path index can either be a member name or an element index inside a JSON tree. A JSONPath expression must start with the $ operator; each path index is separated using either the dot notation or the bracket notation, e.g.:
The available operators are:
More information about JSONPath is available on Stefan Gössner's JSONPath website.
Example of JSONPath matches
The following example shows some of the results of using json.path.Path on a JSON tree. We use the following JSON description of a bookstore:
We can parse the JSON using json.parser.Parser:
JsonParser *parser = json_parser_new (); json_parser_load_from_data (parser, json_data, -1, NULL);
If we run the following code:
JsonNode *result; JsonPath *path = json_path_new (); json_path_compile (path, "$.store..author", NULL); result = json_path_match (path, json_parser_get_root (parser));
The result node will contain an array with all values of the author member of the objects in the JSON tree. If we use a json.generator.Generator to convert the result node to a string and print it:
The output will be: