• Время чтения ~2 мин
  • 14.07.2023

Синтаксический анализатор 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!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297