Синтаксический анализатор JSON — это синтаксический анализатор с нулевыми зависимостями для чтения больших JSON из любого источника с использованием памяти. Вы можете прочитать JSON из любого источника, такого как строка, URL-адрес и т. д., и выполнить итерацию по нему следующим образом:Если вы не хотите использовать foreach
этот синтаксический анализатор, он также поставляется с методом, который выглядит следующим образом:
// 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
}
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, traverse
но пакет поддерживает несколько источников данных. На момент написания статьи в файле readme перечислены следующие источники:
- strings, например, {"foo":"bar"}
- iterables, т.е. массивы или экземпляры Traversable
- Пути к файлам, например, /path/to/large.json
- Ресурсы, например, потоки
- URL-адреса конечных точек API, например 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
- Запросы HTTP-клиента Laravel, т.е. любой экземпляр Illuminate\Http\Client\Request
- Ответы HTTP-клиента Laravel, т.е. любой экземпляр 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!