mtdowling/jmespath.php

声明性地指定如何从JSON文档中提取元素

2.8.0 2024-09-04 18:46 UTC

README

JMESPath(发音为"jaymz path")允许您声明性地指定如何从JSON文档中提取元素。 jmespath.php 允许您在PHP应用程序中使用PHP数据结构使用JMESPath。它需要PHP 7.2.5或更高版本,可以通过使用 Composermtdowling/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