forked from vitalif/fast-json-stream
70 lines
1.7 KiB
Markdown
70 lines
1.7 KiB
Markdown
# Fast PHP Streaming JSON parser
|
|
|
|
I found 2 implementations of streaming JSON parsers for PHP:
|
|
|
|
https://github.com/skolodyazhnyy/json-stream
|
|
|
|
https://github.com/salsify/jsonstreamingparser
|
|
|
|
Both are bad:
|
|
|
|
- json-stream reads and parses the input stream character by character.
|
|
- jsonstreamingparser reads the input stream line by line, but still parses it character by character.
|
|
- jsonstreamingparser is SAX-like, inconvenient to use.
|
|
- both require filehandle to work, can't work with mock function.
|
|
|
|
Quick tests show that json-stream requires 4.18s to parse a sample 13MB json file, jsonstreamingparser
|
|
is even worse and requires 6.05s.
|
|
|
|
This library does the same thing in 1.04s.
|
|
|
|
No composer, PHP is not the place for npm.
|
|
|
|
## Usage
|
|
|
|
[enterArray|enterObject ...] readValue, readValue, readValue [exitArray|exitObject]
|
|
|
|
```
|
|
<?php
|
|
|
|
require_once './JSONStream.php';
|
|
|
|
$fp = fopen('datasets.json', 'r');
|
|
$json = new JSONStream(function() use($fp) { return fread($fp, 262144); });
|
|
$json->enterArray();
|
|
while (!$json->isEnded())
|
|
{
|
|
$json->enterObject();
|
|
while ($json->readValue($k))
|
|
{
|
|
$json->readValue($v);
|
|
if ($k == 'Caption')
|
|
{
|
|
print "$v\n";
|
|
}
|
|
}
|
|
$json->exitObject();
|
|
}
|
|
$json->exitArray();
|
|
fclose($fp);
|
|
|
|
$fp = fopen('datasets.json', 'r');
|
|
$json = new JSONStream(function() use($fp) { return fread($fp, 262144); });
|
|
$json->enterArray();
|
|
while (!$json->isEnded())
|
|
{
|
|
$json->readValue($v);
|
|
print $v['Caption']."\n";
|
|
}
|
|
$json->exitArray();
|
|
fclose($fp);
|
|
```
|
|
|
|
## Author and license
|
|
|
|
Author: Vitaliy Filippov, 2018+
|
|
|
|
License: GNU LGPL 3.0 or MPL (file-level copyleft)
|
|
|
|
As usual, the software is provided "as is", without the warranty of any kind.
|