remorhaz / php-json-parser
用 PHP 编写的 JSON (RFC 8259) 解析器
dev-master
2018-05-09 20:27 UTC
Requires
- php: ^7.1
- remorhaz/php-unilex: ^0.0.11
Requires (Dev)
- phing/phing: ^2.16
- phpunit/phpunit: ^7.0 !=7.0.1
- squizlabs/php_codesniffer: ^3.2.0
This package is auto-updated.
Last update: 2024-09-12 00:39:35 UTC
README
用 PHP 编写的 JSON (RFC 8259) 流式推送解析器。
要求
- PHP 7.1+
许可证
此库采用 MIT 许可证授权。
安装
安装过程与其他任何 composer 库一样简单
composer require remorhaz/php-json-parser
使用方法
首先,您需要在您的监听器对象中实现 Remorhaz\JSON\Parser\Stream\EventListenerInterface
。在大多数情况下,您可以直接扩展 Remorhaz\JSON\Parser\Stream\AbstractEventListener
类并重写其任意方法。
然后,您将监听器实例作为参数传递给 Remorhaz\JSON\Parser\Parser
类的构造函数。现在,您只需要调用解析器的 parse()
方法,传入一些有效的 JSON 字符串,它就会在相应的事件上触发监听器的相关方法。
示例
让我们创建一个简单的监听器,它将连接给定 JSON 字符串中的所有字符串值。
<?php namespace Remorhaz\JSON\Parser\Example; use Remorhaz\JSON\Parser\Stream\AbstractEventListener; use Remorhaz\JSON\Parser\Stream\Event; /** * Example JSON streaming parser event listener that concatenates all string values from input document. */ class StringConcatenator extends AbstractEventListener { /** * Stores concatenated result. * * @var string */ private $buffer = ''; /** * Returns concatenated result. * * @return string */ public function getBuffer(): string { return $this->buffer; } /** * Is called by parser for each string value in input stream. * * @param Event\StringInterface $string */ public function onString(Event\StringInterface $string): void { $this->buffer .= $string->asString(); } }
现在让我们看看它是如何工作的
<?php namespace Remorhaz\JSON\Parser\Example\Test; use PHPUnit\Framework\TestCase; use Remorhaz\JSON\Parser\Example\StringConcatenator; use Remorhaz\JSON\Parser\Parser; /** * @covers \Remorhaz\JSON\Parser\Example\StringConcatenator */ class StringConcatenatorTest extends TestCase { /** * @throws \Remorhaz\JSON\Parser\Exception */ public function testGetBuffer_ParsingDone_ReturnsAllStringValuesConcatenation(): void { $json = '[0, "a", {"b": "c", "d": {"e": true, "f": "g"}}, null]'; $concatenator = new StringConcatenator; (new Parser($concatenator))->parse($json); $actualValue = $concatenator->getBuffer(); self::assertSame("acg", $actualValue); } }