This is a JSONPath implementation for PHP based on Stefan Goessner's JSONPath script.
JSONPath is an XPath-like expression language for filtering, flattening and extracting data.
I believe that is improves on the original script (which was last updated in 2007) by doing a few things:
eval()
in useJSONPath | Result |
---|---|
$.store.books[\*].author |
the authors of all books in the store |
$..author |
all authors |
$.store..price |
the price of everything in the store. |
$..books[2] |
the third book |
$..books[(@.length-1)] |
the last book in order. |
$..books[0,1] |
the first two books |
$..books[:2] |
the first two books |
$..books[?(@.isbn)] |
filter all books with isbn number |
$..books[?(@.price<10)] |
filter all books cheapier than 10 |
$..* |
all elements in the data (recursively extracted) |
Symbol | Description |
---|---|
$ |
The root object/element (not strictly necessary) |
@ |
The current object/element |
. or [] |
Child operator |
.. |
Recursive descent |
* |
Wildcard. All child elements regardless their index. |
[,] |
Array indices as a set |
[start:end:step] |
Array slice operator borrowed from ES4/Python. |
?() |
Filters a result set by a script expression |
() |
Uses the result of a script expression as the index |
$data = ['people' => [['name' => 'Joe'], ['name' => 'Jane'], ['name' => 'John']]];
$result = (new JSONPath($data))->find('$.people.*.name'); // returns new JSONPath
// $result[0] === 'Joe'
// $result[1] === 'Jane'
// $result[2] === 'John'
The options flag JSONPath::ALLOW_MAGIC
will instruct JSONPath when retrieving a value to first check if an object
has a magic __get()
method and will call this method if available. This feature is iffy and
not very predictable as:
property_exists
check for magic methods so an object with a magic __get()
will always return true
when checking__get()
is your own problem to deal with$jsonPath = new JSONPath($myObject, JSONPath::ALLOW_MAGIC);
For more examples, check the JSONPathTest.php tests file.
Script expressions are not supported as the original author intended because:
eval
(boo).So here are the types of query expressions that are supported:
[?(@._KEY_ _OPERATOR_ _VALUE_)] // <, >, !=, and ==
Eg.
[?(@.title == "A string")] //
[?(@.title = "A string")]
// A single equals is not an assignment but the SQL-style of '=='
JMESPath does similiar things, is full of features and has a PHP implementation
The Hash utility from CakePHP does some similar things
The original JsonPath implementations is available at http://code.google.com/p/jsonpath and re-hosted for composer
here Peekmo/JsonPath.
ObjectPath (https://github.com/adriank/ObjectPath) appears to be a Python/JS implementation
with a new name and extra features.