crocodile2u / json-streamer
此包最新版本(v1.0.0)没有可用的许可信息。
内存高效且快速的流式JSON解析器
v1.0.0
2019-07-01 11:34 UTC
Requires
- php: >=7.2
- ext-json: *
- bcncommerce/json-stream: ^0.4.1
Requires (Dev)
- phpunit/phpunit: ^8.2
This package is not auto-updated.
Last update: 2024-09-18 12:15:23 UTC
README
内存高效且快速的流式JSON解析器。
示例:解析包含FeatureCollection的gzipped JSON文件中的GeoJson,按特征逐个流式传输。`JsonStreamer`构造函数的第二个参数是你想要流式传输的数组在JSON结构中的路径。在这个例子中,GeoJson的`FeatureCollection`是一个具有特征对象数组的`features`属性的object。
$fp = fopen("compress.zlib://" . __DIR__ . "/Fiji.GeoJson.gz", "r");
$parser = new \JsonStreamer\JsonStreamer($fp, "features");
foreach ($parser as $val) {
echo substr(json_encode($val), 0, 100)."\n\n";
}
你想要流式传输的数组可以深嵌在JSON结构中。在这里,我们感兴趣的数据位于第3级。如果你要在JavaScript中访问此数组,那将类似于以下内容
let container = {
"lvl1": {
"lvl2": {
"lvl3": [
[1, 2, 3],
[1, 2, 3, 4],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6]
]
}
}
}
let data = container.lvl1.lvl2.lvl3
使用`JsonStreamer`在PHP中遍历相同的数据,请执行以下操作
$fp = fopen('data://text/plain,' . $json,'r');
$parser = new \JsonStreamer\JsonStreamer($fp, "lvl1.lvl2.lvl3");
foreach ($parser as $val) {
echo json_encode($val) . "\n\n";
}
`JsonStreamer`是针对GeoJson构建的,并且只能遍历JSON数组(可能嵌套在包装对象内部)。但是,与其他流式JSON解析器相比,它的效率相当高。我能够以比任何其他流式JSON解析器都快十倍的速度解析包含巨大GeoJson形状(多边形)的GeoJson文件,并且使用大约少4倍的内存。我这样说,没有任何贬低那些项目的意图:它们是通用的JSON解析器,而`JsonStreamer`只做非常特定的一种工作。