cerbero / lazy-json
一个框架无关的包,用于将任何维度和来源的JSON文件加载到Laravel的懒加载集合中。
Requires
- php: ^8.1
- cerbero/json-parser: ^1.1
- illuminate/collections: >=8.12
Requires (Dev)
- pestphp/pest: ^2.16
- phpstan/phpstan: ^1.9
- scrutinizer/ocular: ^1.8
- squizlabs/php_codesniffer: ^3.0
- tightenco/duster: ^2.0
This package is auto-updated.
Last update: 2024-08-30 01:38:14 UTC
README
LazyCollection::fromJson($source, 'data.*.users.*') ->map($this->mapToUser(...)) ->filter($this->filterUser(...)) ->values() ->chunk(1_000) ->each($this->storeUsersChunk(...));
一个框架无关的包,用于将任何大小和来源的JSON文件加载到Laravel懒加载集合。
懒JSON递归地将任何JSON数组或对象转换为懒加载集合,在解析任何维度的JSON时仅消耗少量内存。
它还允许通过简单的点号语法仅提取某些子树,而不是整个JSON。
底层,使用 🧩 JSON解析器 来解析JSON并提取子树。
需要从分页JSON API中懒加载项目?请考虑使用🐼 懒加载JSON页面。
📦 安装
通过Composer
composer require cerbero/lazy-json
🔮 使用方法
👣 基础知识
根据我们的编码风格,我们可以以3种不同的方式调用Lazy JSON
use Cerbero\LazyJson\LazyJson; use Illuminate\Support\LazyCollection; use function Cerbero\LazyJson\lazyJson; // auto-registered lazy collection macro $lazyCollection = LazyCollection::fromJson($source); // static method $lazyCollection = LazyJson::from($source); // namespaced helper $lazyCollection = lazyJson($source);
示例中的变量 $source
代表任何 JSON来源。一旦定义了来源,我们就可以将Laravel懒加载集合的任何方法链接起来,以内存高效的方式处理JSON
LazyCollection::fromJson($source) ->values() ->map(/* ... */) ->where(/* ... */) ->each(/* ... */);
💧 来源
JSON来源是任何提供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来源的更多信息,请参阅🧩 JSON解析器文档。
🎯 点号
如果我们只需要大型JSON的一个子树,我们可以使用简单的点号语法来提取所需的路径(或点)。
以此JSON为例。要仅提取城市并避免解析其余的JSON,我们可以设置results.*.location.city
点号。
$source = 'https://randomuser.me/api/1.4?seed=json-parser&results=5'; $dot = 'results.*.location.city'; LazyCollection::fromJson($source, $dot)->each(function (string $value, string $key) { // 1st iteration: $key === 'city', $value === 'Sontra' // 2nd iteration: $key === 'city', $value === 'San Rafael Tlanalapan' // 3rd iteration: $key === 'city', $value === 'گرگان' // ... });
点号语法非常简单,它可以包括以下4个元素中的任何一个
- JSON数组的一个键,例如
0
- JSON对象的一个键,例如
results
- 一个点以表示JSON内部的嵌套级别,例如
results.0
- 一个星号以表示数组中的所有项,例如
results.*
如果我们需要提取多个子树,Lazy JSON支持多个点号
$dots = ['results.*.gender', 'results.*.email']; LazyCollection::fromJson($source, $dots)->each(function (string $value, string $key) { // 1st iteration: $key === 'gender', $value === 'female' // 2nd iteration: $key === 'email', $value === 'sara.meder@example.com' // 3rd iteration: $key === 'gender', $value === 'female' // 4th iteration: $key === 'email', $value === 'andrea.roque@example.com' // ... });
📆 更新日志
请参阅变更日志以获取有关最近更改的更多信息。
🧪 测试
composer test
💞 贡献
🧯 安全性
如果您发现任何安全相关的问题,请通过电子邮件andrea.marco.sartori@gmail.com联系,而不是使用问题跟踪器。
🏅 致谢
⚖️ 许可证
MIT 许可证(MIT)。请参阅许可证文件以获取更多信息。