cerbero/lazy-json

一个框架无关的包,用于将任何维度和来源的JSON文件加载到Laravel的懒加载集合中。

2.0.0 2023-11-29 10:16 UTC

This package is auto-updated.

Last update: 2024-08-30 01:38:14 UTC


README

Author PHP Version Build Status Coverage Status Quality Score PHPStan Level Latest Version Software License PER Total Downloads

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)。请参阅许可证文件以获取更多信息。