remorhaz/php-json-parser

用 PHP 编写的 JSON (RFC 8259) 解析器

dev-master 2018-05-09 20:27 UTC

This package is auto-updated.

Last update: 2024-09-12 00:39:35 UTC


README

License Latest Stable Version Maintainability Test Coverage

用 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);
    }
}