mtdowling / jmespath.php
声明性地指定如何从JSON文档中提取元素
Requires
- php: ^7.2.5 || ^8.0
- symfony/polyfill-mbstring: ^1.17
Requires (Dev)
- composer/xdebug-handler: ^3.0.3
- phpunit/phpunit: ^8.5.33
README
JMESPath(发音为"jaymz path")允许您声明性地指定如何从JSON文档中提取元素。 jmespath.php 允许您在PHP应用程序中使用PHP数据结构使用JMESPath。它需要PHP 7.2.5或更高版本,可以通过使用 Composer 的 mtdowling/jmespath.php
包来安装。
require 'vendor/autoload.php'; $expression = 'foo.*.baz'; $data = [ 'foo' => [ 'bar' => ['baz' => 1], 'bam' => ['baz' => 2], 'boo' => ['baz' => 3] ] ]; JmesPath\search($expression, $data); // Returns: [1, 2, 3]
PHP使用
在大多数情况下,可以使用库中的 JmesPath\search
函数。此函数利用基于您环境的JMESPath运行时。使用的运行时可以通过环境变量配置,并且可能在未来的某个时刻自动利用C扩展(如果可用)。
$result = JmesPath\search($expression, $data); // or, if you require PSR-4 compliance. $result = JmesPath\Env::search($expression, $data);
运行时
jmespath.php使用 运行时。目前有两个运行时:AstRuntime和CompilerRuntime。
AstRuntime
AstRuntime 默认由 JmesPath\search()
和 JmesPath\Env::search()
使用。
AstRuntime 会解析一个表达式,将生成的AST缓存到内存中,并使用外部树访问者来解释AST。AstRuntime为具有低到中等重用水平的JMESPath表达式提供了一种很好的通用解释方法。
$runtime = new JmesPath\AstRuntime(); $runtime('foo.bar', ['foo' => ['bar' => 'baz']]); // > 'baz'
CompilerRuntime
JmesPath\CompilerRuntime
为具有中等到高重用水平的JMESPath表达式的应用程序提供了最佳性能。CompilerRuntime将遍历JMESPath AST并生成PHP源代码,从而实现7倍到60倍的速度提升。
将JMESPath表达式编译为源代码的过程比通过AstRuntime(通过AstRuntime)遍历和解释JMESPath AST要慢。然而,运行编译后的JMESPath代码的结果比遍历AST要好得多。这实际上意味着使用CompilerRuntime时存在一个预热期,但经过预热期后,它将提供更好的性能。
如果您知道您将多次执行JMESPath表达式,或者您可以在执行之前预编译JMESPath表达式(例如,服务器端应用程序),请使用CompilerRuntime。
// Note: The cache directory argument is optional. $runtime = new JmesPath\CompilerRuntime('/path/to/compile/folder'); $runtime('foo.bar', ['foo' => ['bar' => 'baz']]); // > 'baz'
环境变量
您可以通过设置环境变量 JP_PHP_COMPILE
为 "on" 或为磁盘上的目录来存储缓存的表达式,在 JmesPath\search()
中使用CompilerRuntime。
测试
可以在 https://github.com/jmespath/jmespath.php/tree/master/tests/compliance 找到完整的测试用例列表。这些合规性测试由jmespath.php使用以确保与其他实现的兼容性,并可以作为语言示例。
jmespath.php使用PHPUnit进行测试。为了运行测试,您需要首先按照 安装 部分中描述的方法使用Composer安装依赖项。接下来,只需通过make运行测试即可。
make test
您还可以运行一系列性能测试。
make perf