maxakawizard / json-collection-parser
适用于包含对象数组的大型JSON文件的流式解析器
1.10.0
2023-12-19 14:54 UTC
Requires
- php: >=7.1
- psr/http-message: ~1.0|~2.0
- salsify/json-streaming-parser: ^8.0.2
Requires (Dev)
- mockery/mockery: ^1.3
- phpunit/phpunit: >6 <10
- squizlabs/php_codesniffer: ~3.0
Suggests
- ext-zlib: Needed to support GZIP-compressed files
README
基于事件的解析器,用于处理大型JSON集合(消耗少量内存)。基于 JSON Streaming Parser 构建
此包符合 PSR-4 和 PSR-12 代码风格,并支持解析 PSR-7 消息接口。如果您发现合规性疏忽,请通过拉取请求发送补丁。
安装
您需要 Composer 来安装此包
composer require maxakawizard/json-collection-parser:~1.0
输入数据格式
数据必须以下格式之一
对象数组(有效的JSON)
[ { "id": 78, "title": "Title", "dealType": "sale", "propertyType": "townhouse", "properties": { "bedroomsCount": 6, "parking": "yes" }, "photos": [ "1.jpg", "2.jpg" ], "agents": [ { "name": "Joe", "email": "joe@realestate.email" }, { "name": "Sally", "email": "sally@realestate.email" } ] }, { "id": 729, "dealType": "rent_long", "propertyType": "villa" }, { "id": 5165, "dealType": "rent_short", "propertyType": "villa" } ]
对象字面量序列
{
"id": 78,
"dealType": "sale",
"propertyType": "townhouse"
}
{
"id": 729,
"dealType": "rent_long",
"propertyType": "villa"
}
{
"id": 5165,
"dealType": "rent_short",
"propertyType": "villa"
}
对象和数组字面量序列
[[{
"id": 78,
"dealType": "sale",
"propertyType": "townhouse"
}]]
{
"id": 729,
"dealType": "rent_long",
"propertyType": "villa"
}
[{
"id": 5165,
"dealType": "rent_short",
"propertyType": "villa"
}]
对象和数组字面量序列(子数组中的某些对象,逗号分隔)
[
{
"id": 78,
"dealType": "sale",
"propertyType": "townhouse"
},
{
"id": 729,
"dealType": "rent_long",
"propertyType": "villa"
}
]
{
"id": 5165,
"dealType": "rent_short",
"propertyType": "villa"
}
用法
作为回调函数使用函数
function processItem(array $item) { is_array($item); //true print_r($item); } $parser = new \JsonCollectionParser\Parser(); $parser->parse('/path/to/file.json', 'processItem');
作为回调函数使用闭包
$items = []; $parser = new \JsonCollectionParser\Parser(); $parser->parse('/path/to/file.json', function (array $item) use (&$items) { $items[] = $item; });
作为回调函数使用静态方法
class ItemProcessor { public static function process(array $item) { is_array($item); //true print_r($item); } } $parser = new \JsonCollectionParser\Parser(); $parser->parse('/path/to/file.json', ['ItemProcessor', 'process']);
作为回调函数使用实例方法
class ItemProcessor { public function process(array $item) { is_array($item); //true print_r($item); } } $parser = new \JsonCollectionParser\Parser(); $processor = new \ItemProcessor(); $parser->parse('/path/to/file.json', [$processor, 'process']);
以对象形式接收项目
function processItem(\stdClass $item) { is_array($item); //false is_object($item); //true print_r($item); } $parser = new \JsonCollectionParser\Parser(); $parser->parseAsObjects('/path/to/file.json', 'processItem');
以数组形式接收项目块
function processChunk(array $chunk) { is_array($chunk); //true count($chunk) === 5; //true foreach ($chunk as $item) { is_array($item); //true is_object($item); //false print_r($item); } } $parser = new \JsonCollectionParser\Parser(); $parser->chunk('/path/to/file.json', 'processChunk', 5);
以对象形式接收项目块
function processChunk(array $chunk) { is_array($chunk); //true count($chunk) === 5; //true foreach ($chunk as $item) { is_array($item); //false is_object($item); //true print_r($item); } } $parser = new \JsonCollectionParser\Parser(); $parser->chunkAsObjects('/path/to/file.json', 'processChunk', 5);
将流作为解析器输入
$stream = fopen('/path/to/file.json', 'r'); $parser = new \JsonCollectionParser\Parser(); $parser->parseAsObjects($stream, 'processItem');
将 PSR-7 MessageInterface 作为解析器输入
use Psr\Http\Message\MessageInterface; /** @var MessageInterface $resource */ $resource = $httpClient->get('https://httpbin.org/get'); $parser = new \JsonCollectionParser\Parser(); $parser->parseAsObjects($resource, 'processItem');
将 PSR-7 StreamInterface 作为解析器输入
use Psr\Http\Message\MessageInterface; /** @var MessageInterface $resource */ $resource = $httpClient->get('https://httpbin.org/get'); $parser = new \JsonCollectionParser\Parser(); $parser->parseAsObjects($resource->getBody(), 'processItem');
支持的格式
.json
- 原始JSON.gz
- GZIP压缩JSON(您需要安装zlib
PHP 扩展)
支持的资源
- 文件
- 字符串
- 流/资源
- HTTP消息接口 PSR-7
运行测试
composer test
许可证
此库采用 MIT 许可证发布。