PHP Classes

PHP JSON Path: Query values from data structures like XPATH

Recommend this page to a friend!
  Info   View files Documentation   View files View files (45)   DownloadInstall with Composer Download .zip   Reputation   Support forum   Blog (1)    
Ratings Unique User Downloads Download Rankings
Not yet rated by the usersTotal: 79 This week: 1All time: 10,091 This week: 560Up
Version License PHP version Categories
jsonpath 0.8.0MIT/X Consortium ...8Data types, Validation, Parsers, PHP 7
Description 

Authors

Stephen Frank
Sascha Greuel


Contributor

This package can query values from data structures like XPATH.

It takes a PHP object or another type of value and processes it using functions that can search for elements of the data structure using expressions similar to XPATH to specify the location of the data structures elements that need to found.

The package and extract the information that matches the data specified by the query expression.

Innovation Award
PHP Programming Innovation award nominee
November 2020
Number 9
XPATH is XML based language that is used to defined expressions to finde elements in a XML document that match given criteria.

This package implements a way to search in PHP objects or other type of data structures using a language to define search criteria very similar to XPATH.

It helps searching and processing complex data structures using minimal amount of code.

Manuel Lemos
Picture of Sascha Greuel
  Performance   Level  
Name: Sascha Greuel <contact>
Classes: 3 packages by
Country: Germany Germany
Age: 36
All time rank: 4165223 in Germany Germany
Week rank: 411 Up15 in Germany Germany Up
Innovation award
Innovation award
Nominee: 2x

Winner: 1x

Documentation

JSONPath for PHP

Build Status Latest Release MIT licensed Plant Tree Codecov branch Code Climate maintainability

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:

- Object-oriented code (should be easier to manage or extend in future) - Expressions are parsed into tokens using code inspired by the Doctrine Lexer. The tokens are cached internally to avoid re-parsing the expressions. - There is no eval() in use - Any combination of objects/arrays/ArrayAccess-objects can be used as the data input which is great if you're de-serializing JSON in to objects or if you want to process your own data structures.

Installation

composer require softcreatr/jsonpath:"^0.5 || ^0.7 || ^0.8"

JSONPath Examples

JSONPath | 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[-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 cheaper than 10 $..books.length | the amount of books $..* | all elements in the data (recursively extracted)

Expression syntax

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

PHP Usage

Using arrays

<?php
require_once __DIR__ . '/vendor/autoload.php';

$data = ['people' => [
    ['name' => 'Sascha'],
    ['name' => 'Bianca'],
    ['name' => 'Alexander'],
    ['name' => 'Maximilian'],
]];

print_r((new \Flow\JSONPath\JSONPath($data))->find('$.people.*.name')->getData());

/*
Array
(
    [0] => Sascha
    [1] => Bianca
    [2] => Alexander
    [3] => Maximilian
)
*/

Using objects

<?php
require_once __DIR__ . '/vendor/autoload.php';

$data = json_decode('{"name":"Sascha Greuel","birthdate":"1987-12-16","city":"Gladbeck","country":"Germany"}', false);

print_r((new \Flow\JSONPath\JSONPath($data))->find('$')->getData()[0]);

/*
stdClass Object
(
    [name] => Sascha Greuel
    [birthdate] => 1987-12-16
    [city] => Gladbeck
    [country] => Germany
)
*/

More examples can be found in the Wiki

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:

  • wildcard and recursive features will only look at public properties and can't smell which properties are magically accessible
  • there is no `property_exists` check for magic methods so an object with a magic `__get()` will always return `true` when checking if the property exists
  • any errors thrown or unpredictable behaviour caused by fetching via `__get()` is your own problem to deal with
use Flow\JSONPath\JSONPath;

$myObject = (new Foo())->get('bar');
$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:

  • This would only be achievable through `eval` (boo).
  • Using the script engine from different languages defeats the purpose of having a single expression evaluate the same way in different languages which seems like a bit of a flaw if you're creating an abstract expression syntax.

So here are the types of query expressions that are supported:

[?(@._KEY_ _OPERATOR_ _VALUE_)] // <, >, <=, >=, !=, ==, =~, in and nin
e.g.
[?(@.title == "A string")] //
[?(@.title = "A string")]
// A single equals is not an assignment but the SQL-style of '=='
[?(@.title =~ /^a(nother)? string$/i)]
[?(@.title in ["A string", "Another string"])]
[?(@.title nin ["A string", "Another string"])]

Known issues

  • This project has not implemented multiple string indexes e.g. `$[name,year]` or `$["name","year"]`. I have no ETA on that feature, and it would require some re-writing of the parser that uses a very basic regex implementation.

Similar projects

FlowCommunications/JSONPath is the predecessor of this library by Stephen Frank

Other / Similar implementations can be found in the Wiki.

Changelog

A list of changes can be found in the CHANGELOG.md file.

License ?

MIT © 1-2.dev

This package is Treeware. If you use it in production, then we ask that you buy the world a tree to thank us for our work. By contributing to the ecologi project, you?ll be creating employment for local families and restoring wildlife habitats.

Contributors ?

<table> <tr>

<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
    <a href=https://github.com/SoftCreatR>
        <img src=https://avatars.githubusercontent.com/u/81188?v=4 width="100;"  alt=Sascha Greuel/>
        <br />
        <sub style="font-size:14px"><b>Sascha Greuel</b></sub>
    </a>
</td>
<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
    <a href=https://github.com/warlof>
        <img src=https://avatars.githubusercontent.com/u/648753?v=4 width="100;"  alt=Loïc Leuilliot/>
        <br />
        <sub style="font-size:14px"><b>Loïc Leuilliot</b></sub>
    </a>
</td>
<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
    <a href=https://github.com/SG5>
        <img src=https://avatars.githubusercontent.com/u/3931761?v=4 width="100;"  alt=Sergey/>
        <br />
        <sub style="font-size:14px"><b>Sergey</b></sub>
    </a>
</td>
<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
    <a href=https://github.com/drealecs>
        <img src=https://avatars.githubusercontent.com/u/209984?v=4 width="100;"  alt=Alexandru P?tr?nescu/>
        <br />
        <sub style="font-size:14px"><b>Alexandru P?tr?nescu</b></sub>
    </a>
</td>
<td align="center" style="word-wrap: break-word; width: 150.0; height: 150.0">
    <a href=https://github.com/oleg-andreyev>
        <img src=https://avatars.githubusercontent.com/u/1244112?v=4 width="100;"  alt=Oleg Andreyev/>
        <br />
        <sub style="font-size:14px"><b>Oleg Andreyev</b></sub>
    </a>
</td>

</tr> </table>


  Files folder image Files  
File Role Description
Files folder image.github (2 files, 2 directories)
Files folder imagesrc (5 files, 1 directory)
Files folder imagetests (8 files, 2 directories)
Accessible without login Plain text file CHANGELOG.md Data Auxiliary data
Accessible without login Plain text file CODE_OF_CONDUCT.md Data Auxiliary data
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE.md Lic. License text
Accessible without login Plain text file phpcs.xml Data Auxiliary data
Accessible without login Plain text file phpunit.xml.dist Data Auxiliary data
Accessible without login Plain text file README.md Doc. Documentation

  Files folder image Files  /  .github  
File Role Description
Files folder imageISSUE_TEMPLATE (3 files)
Files folder imageworkflows (2 files)
  Accessible without login Plain text file FUNDING.yml Data Auxiliary data
  Accessible without login Plain text file PULL_REQUEST_TEMPLATE.md Data Auxiliary data

  Files folder image Files  /  .github  /  ISSUE_TEMPLATE  
File Role Description
  Accessible without login Plain text file bug.md Data Auxiliary data
  Accessible without login Plain text file documentation.md Data Auxiliary data
  Accessible without login Plain text file feature.md Data Auxiliary data

  Files folder image Files  /  .github  /  workflows  
File Role Description
  Accessible without login Plain text file Test.yml Data Auxiliary data
  Accessible without login Plain text file UpdateContributors.yml Data Auxiliary data

  Files folder image Files  /  src  
File Role Description
Files folder imageFilters (7 files)
  Accessible without login Plain text file AccessHelper.php Class Class source
  Accessible without login Plain text file JSONPath.php Class Class source
  Accessible without login Plain text file JSONPathException.php Class Class source
  Accessible without login Plain text file JSONPathLexer.php Class Class source
  Accessible without login Plain text file JSONPathToken.php Class Class source

  Files folder image Files  /  src  /  Filters  
File Role Description
  Accessible without login Plain text file AbstractFilter.php Class Class source
  Accessible without login Plain text file IndexesFilter.php Class Class source
  Accessible without login Plain text file IndexFilter.php Class Class source
  Accessible without login Plain text file QueryMatchFilter.php Class Class source
  Accessible without login Plain text file QueryResultFilter.php Class Class source
  Accessible without login Plain text file RecursiveFilter.php Class Class source
  Accessible without login Plain text file SliceFilter.php Class Class source

  Files folder image Files  /  tests  
File Role Description
Files folder imagedata (10 files)
Files folder imageTraits (1 file)
  Accessible without login Plain text file JSONPathArrayAccessTest.php Class Class source
  Accessible without login Plain text file JSONPathArrayTest.php Class Class source
  Accessible without login Plain text file JSONPathDashedIndexTest.php Class Class source
  Accessible without login Plain text file JSONPathLexerTest.php Class Class source
  Accessible without login Plain text file JSONPathSliceAccessTest.php Class Class source
  Accessible without login Plain text file JSONPathTest.php Class Class source
  Accessible without login Plain text file JSONPathTestClass.php Class Class source
  Accessible without login Plain text file QueryTest.php Class Class source

  Files folder image Files  /  tests  /  data  
File Role Description
  Accessible without login Plain text file conferences.json Data Auxiliary data
  Accessible without login Plain text file example.json Data Auxiliary data
  Accessible without login Plain text file extra.json Data Auxiliary data
  Accessible without login Plain text file indexed-object.json Data Auxiliary data
  Accessible without login Plain text file locations.json Data Auxiliary data
  Accessible without login Plain text file numerical-indexes-array.json Data Auxiliary data
  Accessible without login Plain text file numerical-indexes-object.json Data Auxiliary data
  Accessible without login Plain text file simple-integers.json Data Auxiliary data
  Accessible without login Plain text file with-dots.json Data Auxiliary data
  Accessible without login Plain text file with-slashes.json Data Auxiliary data

  Files folder image Files  /  tests  /  Traits  
File Role Description
  Accessible without login Plain text file TestDataTrait.php Class Class source

 Version Control Unique User Downloads Download Rankings  
 100%
Total:79
This week:1
All time:10,091
This week:560Up