PHP JSON 解析器 - 以内存高效的方式从任何来源读取大型 JSON
发布时间:作者: Paul Redmond
JSON 解析器 是一个零依赖项的拉取解析器,用于以内存高效的方式从任何来源读取大型 JSON。您可以从任何来源读取 JSON,例如字符串、URL 等,并像这样遍历它
// a source is anything that can provide a JSON, in this case an endpoint$source = 'https://randomuser.me/api/1.4?seed=json-parser&results=5'; foreach (new JsonParser($source) as $key => $value) { // instead of loading the whole JSON, we keep in memory only one key and value at a time}
如果您不想使用 foreach
,此解析器还附带了一个 traverse
方法,如下所示
JsonParser::parse($source)->traverse(function (mixed $value, string|int $key, JsonParser $parser) { // lazily load one key and value at a time; we can also access the parser if needed});
上面的示例演示了使用 URL 处理 JSON,但该包支持多种数据源。在撰写本文时,自述文件 列出了以下来源
- 字符串,例如 {"foo":"bar"}
- 可迭代对象,即数组或 Traversable 的实例
- 文件路径,例如 /path/to/large.json
- 资源,例如流
- API 端点 URL,例如 https://endpoint.json 或任何 Psr\Http\Message\UriInterface 的实例
- PSR-7 请求,即任何 Psr\Http\Message\RequestInterface 的实例
- PSR-7 消息,即任何 Psr\Http\Message\MessageInterface 的实例
- PSR-7 流,即任何 Psr\Http\Message\StreamInterface 的实例
- Laravel HTTP 客户端请求,即任何 Illuminate\Http\Client\Request 的实例
- Laravel HTTP 客户端响应,即任何 Illuminate\Http\Client\Response 的实例
- 用户定义的来源,即任何 Cerbero\JsonParser\Sources\Source 的实例
我想指出的另一个令人惊叹的库功能是指针,它们有助于从大型 JSON 数据集中提取特定子树
// Select the first gender result$json = JsonParser::parse($source)->pointer('/results/0/gender'); foreach ($json as $key => $value) { // 1st and only iteration: $key === 'gender', $value === 'female'} // Get all gender results$json = JsonParser::parse($source)->pointer('/results/-/gender');// ...
这个包还有很多其他功能我还没有提到,你应该去看看!例如,它有一个进度 API 用于跟踪解析进度(即完成百分比、已处理字节等)。查看此包,获取完整的安装说明,并在 GitHub 上查看 源代码!