A JsonPath implementation in PHP

Overview

JsonPath

Build Status Coverage Status Latest Stable Version License

This is a JSONPath implementation for PHP.

This implementation features all elements in the specification except the () operator (in the spcecification there is the $..a[(@.length-1)], but this can be achieved with $..a[-1] and the latter is simpler).

On top of this it implements some extended features:

  • Regex match comparisons (p.e. $.store.book[?(@.author =~ /.*Tolkien/)])
  • For the child operator [] there is no need to surround child names with quotes (p.e. $.[store][book, bicycle]) except if the name of the field is a non-valid javascript variable name.
  • .length can be used to get the length of a string, get the length of an array and to check if a node has children.

Features

This implementation has the following features:

  • Object oriented implementation.
  • Get, set and add operations.
  • Magic methods implemented:
    • __get: $obj->{'$...'}.
    • __set: $obj->{'$...'} = $val.
    • __toString: echo $obj prints the json representation of the JsonObject.
  • Not using eval().

Installation

To install JsonPath you will need to be using Composer in your project. To install it please see the docs.

composer require galbar/jsonpath

Usage

In every file you use it add:

use JsonPath\JsonObject;

Now you can create an instance of JsonObject and use it:

// $json can be a string containing json, a PHP array, a PHP object or null.
// If $json is null (or not present) the JsonObject will be empty.
$jsonObject = new JsonObject();
// or
$jsonObject = new JsonObject($json);

// get
$obj->get($jsonPath);
$obj->{'$.json.path'};

// set
$obj->set($jsonPath, $value);
$obj->{'$.json.path'} = $value;

// get the json representation
$obj->getJson();
$str = (string)$obj;
echo $obj;

// get the PHP array representation
$obj->getValue();

// add values
$obj->add($jsonPath, $value[, $field]);

// remove values
$obj->remove($jsonPath, $field);

SmartGet

When creating a new instance of JsonObject, you can pass a second parameter to the constructor. This sets the behaviour of the instance to use SmartGet.

What SmartGet does is to determine if the given JsonPath branches at some point, if it does it behaves as usual; otherwise, it will directly return the value pointed by the given path (not the array containing it).

GetJsonObjects

Sometimes you need to access multiple values of a subobject that has a long prefix (p.e. $.a.very.long.prefix.for.[*].object), in this case you would first get said object and make a JsonObject of it and then access its properties.

Now if you want to edit the object (set or add values) and want these changes to affect the original object, the way of doing this is by using JsonObject::getJsonObjects($jsonpath). This method works the same way get does, but it will return the results as JsonObject instances containing a reference to the value in the source JsonObject.

JsonPath Language

This library implements the following specification:

var_name    = [\w\_\$^\d][\w\-\$]*
number      = ([0-9]+(\.[0-9]*) | ([0-9]*\.[0-9]+))
string      = ('\''.*?'\'' | '"'.*?'"')
boolean     = ('true' | 'false')
regpattern  = '/'.*?'/'
null        = 'null'
index       = -?[0-9]+

jsonpath    = '$' operator*
childpath   = '@' operator*

operator    = (childname | childfilter | recursive) operator*

childname   = '.' (var_name | '*')
recursive   = '..' (var_name | '*')
childfilter = '[' ('*' | namelist | indexlist | arrayslice | filterexpr) ']'

namelist    = var_name (',' (var_name | '\'' .*? '\'' | '"' .*? '"'))*
indexlist   = index (',' index)*
arrayslice  = index? ':' index? ':' index?
filterexpr  = '?(' ors ')'

ors         = ands (' ' ( 'or' | '\|\|' ) ' ' ands)*
ands        = expr (' ' ( 'and' | '&&' ) ' ' expr)*
expr        = ( 'not ' | '! ' )? (value | comp)
comp        = value ('==' | '!=' | '<' | '>' | '<=' | '>=' | '=~') value
value       = (jsonpath | childpath | number | string | boolean | regpattern | null | length)
length      = (jsonpath | childpath) '.length'

Limitations on the specification:

  • The jsonpath inside value cannot contain or, and or any comparator.
  • Jsonpaths in value return the first element of the set or false if no result.
  • Boolean operations can't be grouped with parethesis.
  • ands are run before ors. That means that a and 1 = b or c != d is the same as (a and 1) or (c != d)

The .length operator can be used to:

  • Get the number of childs a node in the JsonObject has: $..*[?(@.length > 3)]
  • Filter for nodes that have childs: $..*[?(@.length)]
  • Or filter for nodes that don't have childs (leaves): $..*[?(not @.length)]
  • Check the length of a string: $.path.to[?(@.a.string.length > 10)]
  • Get the length of a string: $.path.to.field.length
  • Get the length of an array: $.path.to.array.length
  • Get the length of each array inside an array of arrays: $.path.to.array[*].array[*].length
  • Get the length of each string inside an array of strings: $.path.to.array[*].array[*].key.length

The comparators:
==, !=, <, >, <=, >= do what expected (compare by type and value).
=~ is a regex comparator, matches the left operand with the pattern in the right operand. The value on the left must be a string and on the right regpattern. Other wise returns false.

JsonPath Example

Consider the following json:

{ "store": {
    "book": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95,
        "available": true
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99,
        "available": false
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99,
        "available": true
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99,
        "available": false
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95,
      "available": true
    }
  },
  "authors": [
    "Nigel Rees",
    "Evelyn Waugh",
    "Herman Melville",
    "J. R. R. Tolkien"
  ]
}
JsonPath Result
$.store.bicycle.price The price of the bicycle.
$.store.book[*] All books.
$.store.book[1,3] The second and fourth book.
$.store.book[1:3] From the second book to the third.
$.store.book[:3] From the first book to the third.
$.store.book[x:y:z] Books from x to y with a step of z.
$..book[?(@.category == 'fiction')] All books with category == 'fiction'.
$..*[?(@.available == true)].price All prices of available products.
$..book[?(@.price < 10)].title The title of all books with price lower than 10.
$..book[?(@.author==$.authors[3])] All books by "J. R. R. Tolkien"
$[store] The store.
$['store'] The store.
$..book[*][title, 'category', "author"] title, category and author of all books.

Test

To run tests, from the project root folder:
php app/test.php <jsonpath> [<file to json file>]

If no json file is given it defaults to the json object described previously in this file.

For example:
php app/test.php "$..*[?(@.category == 'fiction' and @.price < 10 or @.color == \"red\")].price"
Result should be:
[19.95,8.99]

Ready to code

you can open the project in your browser and can start coding Gitpod ready-to-code

Docs

To generate the docs, from the project root folder:
php vendor/bin/sami.php update app/docgen.php

Comments
  • JSON keys with spaces

    JSON keys with spaces

    Hi ! We use your library in our project but I encounter the following problem : how to get data for an entry which has spaces in its key ? Like this :

    {
      "2020-08-05 15:59:09": {
        "added": {
          "evaluation": {
            "id": 1,
    

    I tried many things like $.[the date] or $[the date] but didn't succeed:(

    Have you any idea ?

    Thanks !

    opened by samy 10
  • Allow setting json_encode options when calling getJson()

    Allow setting json_encode options when calling getJson()

    So we can customize the returned JSON using the native json_encode options http://php.net/manual/en/function.json-encode.php

    Example: $jsonObj->getJson( JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )

    opened by fayway 9
  • Extending the lib with possibility to generate flat tables

    Extending the lib with possibility to generate flat tables

    I have added extra functionality in my fork. Unfortunatelly I could not extend the by including the lib as dependency and had to modify the core files in the fork.

    I think, this could be a great extension and might become the part of the main lib.

    Here is the usage example:

    JSON:

    {
       "store":{
          "name":"My Store",
          "book":[
             {
                "category":"reference",
                "author":"Nigel Rees",
                "title":"Sayings of the Century",
                "price":8.95,
                "available":true,
                "authors":[
                   "Nigel Rees"
                ]
             },
             {
                "category":"fiction",
                "author":"Evelyn Waugh",
                "title":"Sword of Honour",
                "price":12.99,
                "available":false,
                "authors":[
                   
                ]
             },
             {
                "category":"fiction",
                "author":"Herman Melville",
                "title":"Moby Dick",
                "isbn":"0-553-21311-3",
                "price":8.99,
                "available":true,
                "authors":[
                   "Nigel Rees"
                ]
             },
             {
                "category":"fiction",
                "author":"J. R. R. Tolkien",
                "title":"The Lord of the Rings",
                "isbn":"0-395-19395-8",
                "price":22.99,
                "available":false,
                "authors":[
                   "Evelyn Waugh",
                   "J. R. R. Tolkien"
                ]
             }
          ],
          "bicycle":{
             "color":"red",
             "price":19.95,
             "available":true,
             "model":null,
             "sku-number":"BCCLE-0001-RD"
          },
          "bicycleSet":[
             {
                "color":"red",
                "price":19.95,
                "available":true,
                "model":null,
                "sku-number":"BCCLE-0001-RD"
             },
             {
                "color":"green",
                "price":19.75,
                "available":false,
                "model":null,
                "sku-number":"RCADF-0002-CQ"
             }
          ]
       },
       "authors":[
          "Nigel Rees",
          "Evelyn Waugh",
          "Herman Melville",
          "J. R. R. Tolkien"
       ],
       "Bike models":[
          1,
          2,
          3
       ]
    }
    

    The code:

            $jsonObject = new JsonObject($json);
            $result = $jsonObject->getTable('[$.store.book[*].price,$.store.book[*].price,$.store.book[*].authors[*],$.store.book[*].title,$.store.name]');
    

    The result:

                    array(
                        array(8.95, 8.95, "Nigel Rees", "Sayings of the Century", "My Store"),
                        array(12.99, 12.99, null, "Sword of Honour", "My Store"),
                        array(8.99, 8.99, "Nigel Rees", "Moby Dick", "My Store"),
                        array(22.99, 22.99, "Evelyn Waugh", "The Lord of the Rings", "My Store"),
                        array(22.99, 22.99, "J. R. R. Tolkien", "The Lord of the Rings", "My Store")
                    ),
    

    My fork with the implementation: https://github.com/kirill533/JsonPath-PHP

    opened by kirill533 7
  • Ability to use .length outside of []

    Ability to use .length outside of []

    Hi Galbar, my users would like to use .length operator outside of brackets in order to get length of a JSON array or string value length. Like they can do at https://jsonpath.com. So, I've made a simple update to your lib, it should work fine in case there is nothing with key 'length' at these array level. What do you think about that?

    opened by SergeyNikolaev 7
  • The requested package skyscanner/jsonpath 0.8.0.0 could not be found

    The requested package skyscanner/jsonpath 0.8.0.0 could not be found

    I'm trying to follow the installation instructions, so I've added this ...

    "require": {
        "skyscanner/jsonpath": "dev-master"
    }
    

    in my composer.json and then I've tried

    composer update

    but my system (Ubuntu 15.10), says ...

    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Your requirements could not be resolved to an installable set of packages.
    
      Problem 1
        - The requested package skyscanner/jsonpath 0.8.0.0 could not be found.
    
    Potential causes:
     - A typo in the package name
     - The package is not available in a stable-enough version according to your minimum-stability setting
       see <https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion> for more details.
    
    Read <https://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.
    

    I can't find that file in the repo .... Suggestions?

    Cesare

    opened by cesaregerbino 7
  • Filtering with multiple conditions takes a long time to execute.

    Filtering with multiple conditions takes a long time to execute.

    Hello,

    I am facing performance issue when using your library in my symfony project. I have a JSON file containing a multidimensional structure and manage to use your library to query this.

    I use a query with multiple conditions.

    However the execution time is quicker when using my MySQL db compared to using the JSON file. I have joined the JSON file containing the data and its structure, and a PHP test command file so that you can have a better understanding of what is executed.

    Is there something wrong in my way of using it ?

    Many thanks, Daniel

    json.txt

    TestPerfCommand.txt

    opened by DVelbeck 6
  • Length operator now returning array instead of number (after switching to 1.3)

    Length operator now returning array instead of number (after switching to 1.3)

    On upgrading from 1.2 to 1.3, quite a few of our tests broke since the .length query now seems to return an array with the length in most cases instead of the raw count.

    opened by baohx2000 4
  • Would you please release a new stable package?

    Would you please release a new stable package?

    Hello,

    I found this package via packagist, it was the stable version 1.0 on there. Currently, the dev-master were maintains the .length feature, would you please release a new stable version on packagist?

    opened by TheNorthMemory 4
  • Last item of array not working

    Last item of array not working

    I've been trying to use different notations to get the last item in an array of objects. It seems that the '-' character is breaking the code:

    $.Line[-1:].Amount --> error: Invalid JSON path expression. The error is around character position 7

    $.Line[-1].Amount --> error: Invalid JSON path expression. The error is around character position 7

    $.Line[0].Amount --> successfully returns the Amount of the first object in the Line array

    opened by jordanyoungs 4
  • fix compound key search

    fix compound key search

    Trying to get a value of a key in hash form, and got an exception

    Error in JSONPath near '.6ea500130ed280048b262ce6b3fe4ea0f97b75ad'

    So the simple fix is to add a numbers to a string keys.

    opened by SergeyNikolaev 4
  • Creating node using set method

    Creating node using set method

    This is not an issue rather asking for help or suggestion .

    I have a situation where I need to create nodes dynamically and it has worked far.

    I have two cases If i want to created an array like ['contacts'=>['firstName'=>'first name']] then i can do

    $jsonPathObject = new JsonObject([]) ; $res = $jsonPathObject->set('$.contacts.firstName', 'first name')->getValue();

    $res is ['contacts'=>['firstName']]

    but

    $res = $jsonPathObject->set('$.contacts[*].firstName', 'first name')->getValue(); would result in

    ['contacts'=>[] ]

    Is there any possibility for it to create an array and create array of array instead of an empty array because my need would be to have array

    $res = ['contacts'=> [ ['firstName'=>'foo']] when I set
    $jsonPathObject->set('$.contacts[*].firstName', 'first name')->getValue();

    opened by banstola 4
  • Bug when using negative index triggers DivisionByZeroError

    Bug when using negative index triggers DivisionByZeroError

    Hi I'm just stumbled across a bug when using negative index, but the element with this index does not exist. The error can be triggered like this:

    $object = new \JsonPath\JsonObject('{"data": []}');
    $result = $object->get('$.data[-1]');
    // Triggers DivisionByZeroError
    

    When less objects are present than the negative index, it does overflow, and this seems strange to me. But at least it does not trigger an Error. This might be a secondary bug:

    $object = new \JsonPath\JsonObject('{"data": [{"id": 1},{"id": 2}]}');
    $result = $object->get('$.data[-5].id');
    // $result is [2]
    

    In case index is less than the size of the object, everything works as intended.

    $object = new \JsonPath\JsonObject('{"data": [{"id": 1}]}');
    $result = $object->get('$.data[-1].id');
    // $result is [1]
    
    $object = new \JsonPath\JsonObject('{"data": [{"id": 1},{"id": 2}]}');
    $result = $object->get('$.data[-1].id');
    // $result is [2]
    

    The bug does not apear with positive index, which does not exist. Also this behaviour does make more sense to me than the one with negative index that does not exist:

    $object = new \JsonPath\JsonObject('{"data": []}');
    $result = $object->get('$.data[1].id');
    // $result is []
    
    $object = new \JsonPath\JsonObject('{"data": [{"id": 1},{"id": 2}]}');
    $result = $object->get('$.data[3].id');$
    // $result is []
    
    opened by kohlerdominik 7
  • Returning key of found object

    Returning key of found object

    suppose I have

    {
    "a": {
       "v": "va"
        },
    "b": {
       "v": "vb"
        }
    }
    

    $..[?(@.v=="va")] returns

    [
    {
    	"v":"va"
    }
    ]
    

    how can I get the key of this object which is a ?

    https://extendsclass.com/jsonpath-tester.html suports ~, such that $..[?(@.v=="va")]~ returns

    [
    "a"
    ]
    
    How can I do this in JsonPath-PHP?
    
    opened by bwl21 11
  • Remove without field

    Remove without field

    I did a bit of experimentation with a PR but wasn't quite able to get it to work, so I thought I'd take this to an issue to look for some ideas on how to implement :)

    Given the sample document, I'm interested in being able to use remove() without providing a field, e.g. removing all matching paths.

    Essentially supporting something like this:

    $jsonObject = new JsonObject($json);
    
    $jsonObject->remove("$..book[?(@.category == 'fiction')]");
    
    $results = $jsonObject->toValue();
    
    // $results with all fiction books removed.
    

    I tried a simple unset($element); in the remove code but PHP's unset only unsets the reference, not the original value, so it doesn't quite work.

    opened by chrisvanpatten 1
  • Results do not match other implementations

    Results do not match other implementations

    The following queries provide results that do not match those of other implementations of JSONPath (compare https://cburgmer.github.io/json-path-comparison/):

    • [ ] $.2 Input:

      {"a": "first", "2": "second", "b": "third"}
      

      Expected output:

      ["second"]
      

      Error:

      Invalid JSONPath error: 'Error in JSONPath near '.2''
      
    • [ ] $[0:0] Input:

      ["first", "second"]
      

      Expected output:

      []
      

      Error:

      jsonpath returned false, this might indicate an error
      
    • [ ] $[?(@.key<42)] Input:

      [{"key": 0}, {"key": 42}, {"key": -1}, {"key": 41}, {"key": 43}, {"key": 42.0001}, {"key": 41.9999}, {"key": 100}, {"some": "value"}]
      

      Expected output:

      [{"key": 0}, {"key": -1}, {"key": 41}, {"key": 41.9999}]
      

      Actual output:

      [{"key": 0}, {"key": -1}, {"key": 41}, {"key": 41.9999}, {"some": "value"}]
      
    • [ ] $..* Input:

      {"key": "value", "another key": {"complex": "string", "primitives": [0, 1]}}
      

      Expected output:

      ["string", "value", 0, 1, [0, 1], {"complex": "string", "primitives": [0, 1]}]
      

      Actual output:

      ["string", "value", 0, 1, [0, 1], {"complex": "string", "primitives": [0, 1]}, {"another key": {"complex": "string", "primitives": [0, 1]}, "key": "value"}]
      
    • [ ] $..* Input:

      [40, null, 42]
      

      Expected output:

      [40, null, 42]
      

      Actual output:

      [[40, null, 42], 40, null, 42]
      
    • [ ] $..* Input:

      42
      

      Expected output:

      []
      

      Actual output:

      [42]
      

    For reference, the output was generated by the program in https://github.com/cburgmer/json-path-comparison/tree/master/implementations/PHP_galbar-jsonpath.

    opened by cburgmer 3
  • Update README.md

    Update README.md

    README.md needs to be updated:

    • [ ] https://github.com/Galbar/JsonPath-PHP/issues/29#issuecomment-499373986 : missing examples of jsonpath
    • [x] #30 : change getArray() for getValue()
    opened by Galbar 0
  • JsonObject is turning empty objects into empty arrays

    JsonObject is turning empty objects into empty arrays

    Hi,

    The JsonObject class turns empty objects into empty arrays and thus is unable to give back the original JSON representation.

    For example:

    {
     "item1": {},
     "item2": {}
    }
    

    Is returned as:

    {
     "item1": [],
     "item2": []
    }
    

    Here is how to reproduce it:

     public function test() {
            $this->assertEquals('[{"item":"value"}]', (new JsonObject('[{"item":"value"}]'))->getJson());
            $this->assertEquals('{"item":"value"}', (new JsonObject('{"item":"value"}'))->getJson()); 
            $this->assertEquals('[]', (new JsonObject('[]'))->getJson());
            $this->assertEquals('{}', (new JsonObject('{}'))->getJson());  // FAILS!
        }
    
    Failed asserting that two strings are equal.
    Expected :'{}'
    Actual   :'[]'
    

    Best regards,

    opened by jaaufauvre 5
Releases(2.1)
Owner
Alessio Linares
Alessio Linares
YCOM Impersonate. Login as selected YCOM user 🧙‍♂️in frontend.

YCOM Impersonate Login as selected YCOM user in frontend. Features: Backend users with admin rights or YCOM[] rights, can be automatically logged in v

Friends Of REDAXO 17 Sep 12, 2022
A pure PHP implementation of the MessagePack serialization format / msgpack.org[PHP]

msgpack.php A pure PHP implementation of the MessagePack serialization format. Features Fully compliant with the latest MessagePack specification, inc

Eugene Leonovich 368 Dec 19, 2022
Php-rpc-server - JSON RPC server implementation for PHP.

JSON RPC Server implementation for PHP. The json-rpc is a very simple protocol. You can see this by reading the protocol specification. This library i

null 4 Sep 28, 2022
A pure PHP implementation of the open Language Server Protocol. Provides static code analysis for PHP for any IDE.

A pure PHP implementation of the open Language Server Protocol. Provides static code analysis for PHP for any IDE.

Felix Becker 1.1k Jan 4, 2023
PHP implementation of circuit breaker pattern.

What is php-circuit-breaker A component helping you gracefully handle outages and timeouts of external services (usually remote, 3rd party services).

ArturEjsmont 169 Jul 28, 2022
Implementation of the Token Bucket algorithm in PHP.

Token Bucket This is a threadsafe implementation of the Token Bucket algorithm in PHP. You can use a token bucket to limit an usage rate for a resourc

null 477 Jan 7, 2023
A PHP implementation of the Unleash protocol aka Feature Flags in GitLab.

A PHP implementation of the Unleash protocol aka Feature Flags in GitLab. This implementation conforms to the official Unleash standards and implement

Dominik Chrástecký 2 Aug 18, 2021
An implementation of the Minecraft: Bedrock Edition protocol in PHP

BedrockProtocol An implementation of the Minecraft: Bedrock Edition protocol in PHP This library implements all of the packets in the Minecraft: Bedro

PMMP 94 Jan 6, 2023
PHP Implementation of PASERK

PASERK (PHP) Platform Agnostic SERialized Keys. Requires PHP 7.1 or newer. PASERK Specification The PASERK Specification can be found in this reposito

Paragon Initiative Enterprises 9 Nov 22, 2022
A minimalistic implementation of Promises for PHP

libPromise A minimalistic implementation of Promises for PHP. Installation via DEVirion Install the DEVirion plugin and start your server. This will c

null 8 Sep 27, 2022
PHP's Promse implementation depends on the Swoole module.

php-promise-swoole PHP's Promse implementation depends on the Swoole module. Promise::allsettled([ /** Timer 调用 */ /** Timer call */

拓荒者 3 Mar 15, 2022
A circular buffer implementation in PHP

Circular Buffer Installation ?? This is a great place for showing how to install the package, see below: Run $ composer require lctrs/circular-buffer

null 1 Jan 11, 2022
This package contains a PHP implementation to solve 3D bin packing problems.

3D Bin Packager This package contains a PHP implementation to solve 3d bin packing problems based on gedex implementation on Go and enzoruiz implement

Farista Latuconsina 7 Nov 21, 2022
PHP implementation for reading and writing Apache Parquet files/streams

php-parquet This is the first parquet file format reader/writer implementation in PHP, based on the Thrift sources provided by the Apache Foundation.

null 17 Oct 25, 2022
PHP implementation of PSON

PSON-PHP Information This library is an php implementation of PSON. This software is licensed under the MIT License. Installation You can install this

Simplito 1 Sep 29, 2019
An open-source Minecraft: Java Edition server implementation, written in PHP.

PHPCraft An open-source Minecraft: Java Edition server implementation, written in PHP. What is PHPCraft? PHPCraft is an open-source Minecraft: Java Ed

Karen/あけみ 17 Dec 31, 2022
Php-file-iterator - FilterIterator implementation that filters files based on a list of suffixes, prefixes, and other exclusion criteria.

php-file-iterator Installation You can add this library as a local, per-project dependency to your project using Composer: composer require phpunit/ph

Sebastian Bergmann 7.1k Jan 3, 2023
phly-mustache is a Mustache implementation written for PHP

phly-mustache is a Mustache implementation written for PHP. It conforms to the principles of mustache, and allows for extension of the format via pragmas.

phly 16 Oct 13, 2021
Swaggest JSON-schema implementation for PHP

Swaggest JSON-schema implementation for PHP High definition PHP structures with JSON-schema based validation. Supported schemas: JSON Schema Draft 7 J

null 370 Dec 29, 2022