Home

Awesome

:exclamation: New project maintainers :exclamation:

This project is no longer maintained here. Please go to https://github.com/SoftCreatR/JSONPath.

JSONPath Build Status

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.

This project aims to be a clean and simple implementation with the following goals:

Installation

PHP 7.1+

composer require flow/jsonpath

PHP 5.4 - 5.6

Support for PHP 5.x is deprecated... the current version should work but all unit tests are run against 7.1+ and support may be dropped at any time in the future.

A legacy branch is maintained in php-5.x and can be composer-installed as follows: "flow/jsonpath": "dev-php-5.x"

JSONPath Examples

JSONPathResult
$.store.books[*].authorthe authors of all books in the store
$..authorall authors
$.store..pricethe price of everything in the store.
$..books[2]the third book
$..books[(@.length-1)]the last book in order.
$..books[-1:]the last book in order.
$..books[0,1]the first two books
$..books[:2]the first two books
$..books[::2]every second book starting from first one
$..books[1:6:3]every third book starting from 1 till 6
$..books[?(@.isbn)]filter all books with isbn number
$..books[?(@.price<10)]filter all books cheapier than 10
$..*all elements in the data (recursively extracted)

Expression syntax

SymbolDescription
$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

PHP Usage

$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'

Magic method access

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:

$jsonPath = new JSONPath($myObject, JSONPath::ALLOW_MAGIC);

For more examples, check the JSONPathTest.php tests file.

Script expressions

Script expressions are not supported as the original author intended because:

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 '=='

Known issues

Similar projects

Galbar/JsonPath-PHP is a PHP implementation that does a few things this project doesn't and is a strong alternative

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.

Changelog

0.5.0

0.3.0

0.2.1 - 0.2.5

0.2.0

0.1.x